上面的代码不起作用。实际上,构造函数f
中的默认构造对象Foo
抱怨该值val
未在范围中声明。我不明白为什么不声明它。
struct Foo2
{
Foo2(int val)
{}
};
struct Foo
{
Foo(int val, Foo2 f = Foo2(val))
{}
};
int main()
{
Foo f(1);
return 0;
}
根据C ++标准(8.3.6默认参数):
9每次调用函数时都会评估默认参数。未指定函数参数的评估顺序。因此,即使不对函数参数进行求值,也不得在默认参数中使用该函数的参数。在默认参数之前声明的函数的参数在范围内,并且可以隐藏名称空间和类成员名称。
在任何C ++(不仅是C ++ 2014)中,您都可以重载构造函数。例如
struct Foo
{
Foo(int val )
{ Foo2 f(val); /*...*/ }
Foo(int val, Foo2 f )
{}
};
或者,您可以使用委托的构造函数(如果您的编译器支持新的Standard)
struct Foo
{
Foo(int val ) : Foo( val, Foo2( val ) )
{}
Foo(int val, Foo2 f )
{}
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句