【发布时间】:2014-11-19 13:37:25
【问题描述】:
我找到了this 的问题,我完全感到困惑。
答案说b 无效,“非静态成员不能用作默认参数。”。这很有道理。
我不明白为什么其他两个都可以。事实上,如果默认值不是常量表达式,我很难理解语义是什么......
这里发生了什么?默认参数在编译时明确评估。编译器是否只是选择当前值?
#include <iostream>
int g_x = 44;
struct Foo
{
int m_x;
static int s_x;
Foo(int x) : m_x(x) {}
int a(int x = g_x) { return x + 1; }
int b(int x = m_x) { return x + 1; }
int c(int x = s_x) { return x + 1; }
};
int Foo::s_x = 22;
int main(int argc, char** argv)
{
Foo f(6);
std::cout << f.a() << std::endl;
std::cout << f.b() << std::endl;
std::cout << f.c() << std::endl;
return 0;
}
【问题讨论】:
-
“默认参数在编译时明确评估” - 不,它们不是。每次调用函数时都会对它们进行评估。
-
@MikeSeymour:看起来像答案,闻起来像答案......
-
我不知道非静态成员不能用作默认参数。我不知道为什么不允许这样做。
-
@PhilH:这是一个答案的片段。现在有一个正确的答案。
-
@NeilKirk:出于同样的原因,不能使用其他参数(
this是参数的特例)。未指定评估顺序,但需要解决参数评估之间的依赖关系。
标签: c++ default-arguments