C++ 標準對預設參數的使用範圍有嚴格限制,但許多編譯器為了相容性允許在函數宣告、函數指標、成員函數指標及 typedef 中使用預設值,這屬於非標準擴展,極易埋下移植性與語義混淆的隱患。
struct A {
void func(int x = 5) {}
};
void g(int n = 12) {}
// 以下宣告在標準 C++ 中不合法,但某些編譯器允許
void (*pf)(int i = 120);
void (A::*pmf)(int j = 50);
typedef void (*PF)(int i = 100);
typedef void (&PRF)(int i = 100); // 函數參考
int main() {
pf = g;
PF pf2 = g;
pmf = &A::func;
A a;
pf(); // 使用哪個預設值?
pf2(); // 使用哪個預設值?
(a.*pmf)(); // 使用哪個預設值?
}
雖然 A::func() 與 g() 定義了合理的預設值,但指標 pf、pmf 及 typedef PF 另行指定了不同的預設值。實際測試中:
pf() 呼叫時,編譯器使用 120(pf 宣告的預設值)pf2() 呼叫時,編譯器使用 100(PF typedef 的預設值)g() 透過不同指標型別呼叫,卻得到不同的預設行為遵循標準 C++ 規範,將預設參數僅保留於函數定義與宣告中,是確保程式碼可移植、可維護的關鍵。