我发现了这个问题,我完全感到困惑。
答案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;
}