默认参数必须在编译时绑定 - 为什么?

时间:2012-10-15 20:46:54

标签: c++ compilation default-value

为什么C ++的设计是这样的?...

(这个问题不同,但与

密切相关

Not possible: this pointer as a default argument. Why?

2 个答案:

答案 0 :(得分:11)

实际上,这并不完全准确。限制是:

8.3.6默认参数[dcl.fct.default]

  

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)此处vx都是变量。

使用函数重载可以很容易地实现,而不是必须使用默认参数。

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
}

这迫使程序员编写一个更好的代码,从长远来看这可能是值得的。