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