C++ 標準禁止在下列宣告中出現預設參數:
void (*pf)(int = 120);void (A::*pmf)(int = 50);typedef void (*PF)(int = 100);typedef void (&PRF)(int = 100);但許多編譯器(MSVC、GCC 等)作為非標準擴充予以接受,導致可攜性風險。
struct A { void func(int x=5) {} };
void g(int n=12) {}
void (*pf)(int = 120);
void (A::*pmf)(int = 50);
typedef void (*PF)(int = 100);
typedef void (&PRF)(int = 100);
int main() {
pf = g;
PF pf2 = g;
pmf = &A::func;
A a;
pf(); // 呼叫 g,參數用 120(pf 的預設值)
pf2(); // 呼叫 g,參數用 100(PF 的預設值)
(a.*pmf)(); // 呼叫 A::func,參數用 50(pmf 的預設值)
}
同一函數透過不同指標/型別呼叫時,使用的預設值取決於指標/型別宣告處的預設值,而非函數原始定義。這極易造成維護混淆。
C++11/14/17/20 均未放寬此限制。未來版本可能直接報錯,建議盡早清理。