默认参数必须在编译时绑定-为什么? 为什么C++是这样设计的?……/P>

默认参数必须在编译时绑定-为什么? 为什么C++是这样设计的?……/P>,c++,compilation,default-value,C++,Compilation,Default Value,(这个问题不同,但与 )事实上,这并不完全准确。这些限制包括: 8.3.6默认参数[dcl.fct.Default] 7) 默认参数中不得使用局部变量。[示例: -[结束示例] 8) 关键字this不得在成员函数的默认参数中使用。[示例: 因此,此和局部变量不能用作默认值 例如,以下内容是有效的: int a = 1; int f(int); int g(int x = f(a)); // default argument: f(::a) void h() { a = 2; {

(这个问题不同,但与


)事实上,这并不完全准确。这些限制包括:

8.3.6默认参数[dcl.fct.Default] 7) 默认参数中不得使用局部变量。[示例:

-[结束示例]

8) 关键字
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)
调用,该值不是编译时常量。这是一个直接来自标准的示例


其原因通常是:要么没有提议,要么被拒绝,认为没有必要,要么太难实现。

默认参数是函数体中使用的参数值。此变量(即参数)值可能会被重写,具体取决于函数的调用方式。但是,虽然它不是-默认参数是此变量的,并且必须定义一个值。如果此值必须是动态的-不在编译时绑定-那么可能最好使用单独的函数来计算该值,而不是在<>代码>默认>代码>竞技场。对于这样的场景,C++已经拥有了正确的机制-<代码>多态性函数重载。
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
}
考虑这一点: 您需要使用参数
v
调用函数
Fn
,否则它应该默认为
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
}

<>这强制程序员编写一个更好的代码,这可能是值得的,而在更长的时间内,

C和C++中的很多东西都是标准化的,因为它们使用非动态方法更容易实现。需要有一种机制来在运行时钩住/改变函数的行为,但如果以一种简单的方式实现,这将不可避免地变得复杂。通过定义一个只返回
this
的成员函数并将其用作默认值,您能绕过使用
this
的限制吗?@MarkRansom显然不行--这很有意义,因为您需要
this
来调用成员函数,因为
getA()
相当于
this->getA()
,您不能在默认情况下使用
。@MarkRansom以前从未考虑过:)所有这些都有相同的主题,即调用方需要能够有效地复制和粘贴默认值作为参数,这就是为什么您不能使用
。例如,使用默认值有什么问题在您介绍的例子中?它是如何迫使程序员编写更好的代码的?为什么它是更好的代码?通常,当您编写这样的语句时,您会以某种方式对它们进行备份。@LuchianGrigore优点可能不会立即突出-但依我看:分配函数返回的值是一种独特的操作,不适合成为函数的一部分n的声明或调用。-我认为,在这样一个地方内联这样一个东西会极大地阻碍代码的可读性和结构。我看不出它与调用一个重载有什么不同,重载将函数的参数或返回值传递给另一个重载。它是同一个接口。它如何更好?在我的示例中-Fn()
Fn(BOOL)
除了Fn之外做同样的事情(在做其余的普通事情之前做一个额外的步骤。这是一个很好的分层-操作和语法。在你的答案中提到的例子-
g()
g(int 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
}