为什么 C++ 是这样设计的?...
(这个问题不同,但密切相关
实际上,这并不完全准确。限制是:
7) 局部变量不得在默认参数中使用。[ 例子:
void f() {
int i;
extern void g(int x = i); //error
// ...
}
—结束示例]
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
将使用 value 调用f(2)
,这不是编译时常量。这是直接来自标准的示例。
出现这种情况的原因很常见:要么没有提案,要么被拒绝,被认为没有必要或太难实施。
默认参数是要在函数体中使用的参数的值。该变量(即参数)的值可能会被覆盖,具体取决于函数的调用方式。但是虽然它不是 - 默认参数是这个变量的值- 并且必须定义一个值。如果这个值必须是动态的——在编译期间不被绑定——那么也许应该更好地使用一个单独的函数来计算该值并且似乎不适合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
}
这迫使程序员编写更好的代码,从长远来看这可能是值得的。