答案 0 :(得分:11)
实际上,这并不完全准确。限制是:
7)不应在默认参数中使用局部变量。 [例如:
void f() {
int i;
extern void g(int x = i); //error
// ...
}
-end example]
8)关键字
this
不得用于成员函数的默认参数。 [例如:
class A {
void f(A* p = this) { } // error
};
因此,this
和局部变量不能用作默认值。
例如,以下内容有效:
int a = 1;
int f(int);
int g(int x = f(a)); // default argument: f(::a)
void h() {
a = 2;
{
int a = 3;
g(); // g(f(::a))
}
}
将使用值g
调用 f(2)
,该值不是编译时常量。这是标准的一个例子。
这样的原因通常是:要么没有提案,要么被拒绝,认为没有必要或太难实施。
答案 1 :(得分:0)
默认参数是由于在函数体中使用而导致的参数值。可以覆盖该变量(即参数)值,具体取决于函数的调用方式。但是它不是 - 默认参数是此变量的值 - 并且必须定义一个值。它必须是动态的 - 不要在编译时绑定 - 然后可能更好地使用单独的函数来计算该值,并且似乎不适合default
竞技场。同样对于这种情况,C ++已经有了正确的机制 - Polymorphism
通过函数重载。
考虑一下:
您需要使用参数Fn
调用函数v
,否则默认为Fn(x)
此处v
和x
都是变量。
使用函数重载可以很容易地实现,而不是必须使用默认参数。
BOOL x;
VOID Fn(BOOL v)
{
...
}
VOID Fn()
{
Fn(::x);
}
VOID Main()
{
::x = ...; // Variable x's value is altered
Fn(FALSE);
Fn(); // Param value defaults to value of x
}
这迫使程序员编写一个更好的代码,从长远来看这可能是值得的。