在準(zhǔn)標(biāo)準(zhǔn)C++中,有關(guān)缺省變量值的限制非常模糊。基于此,很多編譯器允許開發(fā)人員將缺省變量值包含在函數(shù)聲明,指向函數(shù)的指針和引用,成員函數(shù)的指針,以及typedef聲明中。
請看一下以下的程序:
struct A
{
void func(int x=5)
{
}
};
void g(int n=12)
{
}
// 根據(jù)C++標(biāo)準(zhǔn),不能在以下聲明中使用缺省變量值。
void (*pf)(inti=120);
void (A::*pmf)(int j=50);
typedef void (*PF)(inti=100);
// 函數(shù)的引用
typedef void (&PRF)(inti=100);
int main()
{
pf=g;
PF pf2=g;
pmf=&A::func;
A a;
//這些調(diào)用使用了哪些缺省值?
pf();
pf2();
(a.*pmf)();
}
A::func()和g()具有缺省變量值,這是合理的。然而,指針pmf,pf以及typedefPF也定義了缺省的變量值。根據(jù)C++標(biāo)準(zhǔn),這是不規(guī)范的。
這一代碼的實際使用中,其中的一個問題是這些聲明中提供的缺省值與A::func()和g()函數(shù)提供的值不一致。也就是說,很多編譯器將這些代碼作為非標(biāo)準(zhǔn)的擴展。當(dāng)調(diào)用g()函數(shù)時,我的編譯將120作為pf的缺省值;然而,對于pf2,它使用100作為它的缺省值。
作為一種規(guī)則,應(yīng)該避免使用指向函數(shù)的指針,成員函數(shù)的指針,以及typedef命名的缺省變量值。即使你的編譯器接受了它們,在更高版本中它也可能不被接受。而且,這些代碼也會降低程序的靈巧性,也會給那些無法判別哪些編譯器接收何種缺省變量的開發(fā)人員帶來誤導(dǎo)。在使用這些缺省變量值的合法代碼中,這里的建議是添加一些必要的注釋,以說明需要哪些缺省變量值。
請看一下以下的程序:
struct A
{
void func(int x=5)
{
}
};
void g(int n=12)
{
}
// 根據(jù)C++標(biāo)準(zhǔn),不能在以下聲明中使用缺省變量值。
void (*pf)(inti=120);
void (A::*pmf)(int j=50);
typedef void (*PF)(inti=100);
// 函數(shù)的引用
typedef void (&PRF)(inti=100);
int main()
{
pf=g;
PF pf2=g;
pmf=&A::func;
A a;
//這些調(diào)用使用了哪些缺省值?
pf();
pf2();
(a.*pmf)();
}
A::func()和g()具有缺省變量值,這是合理的。然而,指針pmf,pf以及typedefPF也定義了缺省的變量值。根據(jù)C++標(biāo)準(zhǔn),這是不規(guī)范的。
這一代碼的實際使用中,其中的一個問題是這些聲明中提供的缺省值與A::func()和g()函數(shù)提供的值不一致。也就是說,很多編譯器將這些代碼作為非標(biāo)準(zhǔn)的擴展。當(dāng)調(diào)用g()函數(shù)時,我的編譯將120作為pf的缺省值;然而,對于pf2,它使用100作為它的缺省值。
作為一種規(guī)則,應(yīng)該避免使用指向函數(shù)的指針,成員函數(shù)的指針,以及typedef命名的缺省變量值。即使你的編譯器接受了它們,在更高版本中它也可能不被接受。而且,這些代碼也會降低程序的靈巧性,也會給那些無法判別哪些編譯器接收何種缺省變量的開發(fā)人員帶來誤導(dǎo)。在使用這些缺省變量值的合法代碼中,這里的建議是添加一些必要的注釋,以說明需要哪些缺省變量值。