4

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

(这个问题不同,但密切相关

不可能:此指针作为默认参数。为什么?)

4

2 回答 2

11

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

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

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),这不是编译时常量。这是直接来自标准的示例。

出现这种情况的原因很常见:要么没有提案,要么被拒绝,被认为没有必要或太难实施。

于 2012-10-15T20:50:00.460 回答
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
}

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

于 2012-10-15T20:57:03.397 回答