在构造函数中的default-construct对象中未声明变量

Mar*_*ese 7 c++ constructor default-constructor

上面的代码不起作用.实际上,构造函数f中的默认构造对象Foo抱怨该值val未在范围中声明.我不明白为什么没有宣布.

struct Foo2
{
  Foo2(int val)
  {}
};

struct Foo
{
  Foo(int val, Foo2 f = Foo2(val))
  {}
};

int main()
{
  Foo f(1);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 5

根据C++标准(8.3.6默认参数):

9每次调用函数时都会计算默认参数.函数参数的评估顺序未指定.因此,函数的参数不应在默认参数中使用,即使它们未被评估.在默认参数之前声明的函数的参数在范围内,并且可以隐藏命名空间和类成员名称.

在任何C++(不仅是C++ 2014)中,您都可以重载构造函数.例如

struct Foo
{
  Foo(int val )
  { Foo2 f(val); /*...*/ }
  Foo(int val, Foo2 f )
  {}
};
Run Code Online (Sandbox Code Playgroud)

或者您可以使用委托构造函数(如果您的编译器支持新标准)

struct Foo
{
  Foo(int val ) : Foo( val, Foo2( val ) )
  {}
  Foo(int val, Foo2 f )
  {}
};
Run Code Online (Sandbox Code Playgroud)