【问题标题】:Default arguments have to be bound at compiled time - why? [closed]默认参数必须在编译时绑定 - 为什么? [关闭]
【发布时间】:2012-10-05 21:43:20
【问题描述】:

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

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

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

【问题讨论】:

  • C 和 C++ 中的很多东西都是标准化的,因为它们使用非动态方法更容易实现。例如。标准中可能有一个条款,要求有一种机制可以在运行时挂钩/更改函数的行为,但是以幼稚的方式实现这将是不必要的复杂。

标签: c++ compilation default-value


【解决方案1】:

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

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 将使用值f(2) 调用,这不是编译时常量。这是一个直接来自标准的示例。

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

【讨论】:

  • 你能通过定义一个简单地返回this的成员函数并将其用作默认值来绕过使用this的限制吗?
  • @MarkRansom 显然不是 - ideone.com/BSjI3 - 这是有道理的,因为你需要this 来调用成员函数,因为getA() 将等同于this->getA(),你可以'不要在默认情况下使用this
  • @MarkRansom 之前从没想过 :)
  • 所有这些都有相同的主题,那就是 调用者 需要能够有效地复制并粘贴默认值作为参数,这就是为什么例如,您不能使用this
【解决方案2】:

默认参数是要在函数体中使用的参数的值。此变量(即参数)的值可能会被覆盖,具体取决于函数的调用方式。但是虽然它不是 - 默认参数是该变量的 value - 并且必须定义一个值。如果这个值必须是动态的——不能在编译期间被绑定——那么也许应该更好地使用一个单独的函数来计算该值,并且似乎不适合default 领域。同样对于这样的场景,C++ 已经有了正确的机制 - Polymorphism 通过函数重载。

考虑一下: 您需要使用参数v 调用函数Fn,否则它应该默认为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
}

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

【讨论】:

  • 在您提出的情况下设置默认值有什么问题?它如何迫使程序员编写更好的代码?为什么它的代码更好?通常,当你做出这样的陈述时,你会以某种方式支持它们。
  • @LuchianGrigore 优势可能不会立即突出 - 但 IMO:分配从函数返回的值是一种独特的操作,不适合成为函数声明或调用的一部分。 - 我认为在这样的地方内联这样的东西会极大地阻碍代码的可读性和结构。
  • 我看不出它与调用将函数的参数或返回值传递给另一个重载的重载有何不同。是同一个界面。怎么样更好?
  • 在我的例子中 - Fn()Fn(BOOL) 除了 Fn 之外做同样的事情(在做其他常见的事情之前做了一个额外的步骤。这很好 分层 - 操作上句法上。如果您的答案中提到的示例 - g()g(int x = ...) 不是前者的赢家,IMO。
  • 我不明白nicely layered operationally and syntactically means 是什么。另外,它不是。在默认情况下,程序员可以看到在不带参数的情况下调用函数时会发生什么。如果您重载并且无权访问实现,则您不知道传递了什么参数,
猜你喜欢
  • 2014-12-02
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
相关资源
最近更新 更多