未在构造函数的默认构造对象中声明变量
Not declared variable in default-constructed object in constructor
以上代码无效。实际上,Foo
的构造函数中的默认构造对象 f
抱怨值 val
未在范围内声明。我不明白为什么不宣布它。
struct Foo2
{
Foo2(int val)
{}
};
struct Foo
{
Foo(int val, Foo2 f = Foo2(val))
{}
};
int main()
{
Foo f(1);
return 0;
}
这就是语言的工作原理;默认参数不能依赖于其他参数,因为它们的初始化顺序未指定。
在 C++11 或更高版本中,您可以通过重载解决此问题:
Foo(int val) : Foo(val, Foo2(val)) {}
struct Foo2
{
int x;
Foo2(int val): x(val) {}
};
struct Foo
{
int y;
Foo2 f2;
Foo(int val, Foo2 f): y(val), f2(f) {}
Foo(int val): y(val), f2(val) {}
};
int main()
{
Foo f(1);
}
您可以使用模板来解决这个问题:
struct Foo2
{
Foo2(int val)
{}
};
template <int val>
struct Foo
{
Foo(Foo2 f = Foo2(val))
{}
};
int main()
{
Foo<1> f = Foo<1>();
return 0;
}
根据 C++ 标准(8.3.6 默认参数):
9 Default arguments are evaluated each time the function is called.
The order of evaluation of function arguments is unspecified.
Consequently, parameters of a function shall not be used in a
default argument, even if they are not evaluated. Parameters of a
function declared before a default argument are in scope and can hide
namespace and class member names.
在任何 C++(不仅是 C++ 2014)中,您都可以重载构造函数。例如
struct Foo
{
Foo(int val )
{ Foo2 f(val); /*...*/ }
Foo(int val, Foo2 f )
{}
};
或者您可以使用委托构造函数(如果您的编译器支持新标准)
struct Foo
{
Foo(int val ) : Foo( val, Foo2( val ) )
{}
Foo(int val, Foo2 f )
{}
};
以上代码无效。实际上,Foo
的构造函数中的默认构造对象 f
抱怨值 val
未在范围内声明。我不明白为什么不宣布它。
struct Foo2
{
Foo2(int val)
{}
};
struct Foo
{
Foo(int val, Foo2 f = Foo2(val))
{}
};
int main()
{
Foo f(1);
return 0;
}
这就是语言的工作原理;默认参数不能依赖于其他参数,因为它们的初始化顺序未指定。
在 C++11 或更高版本中,您可以通过重载解决此问题:
Foo(int val) : Foo(val, Foo2(val)) {}
struct Foo2
{
int x;
Foo2(int val): x(val) {}
};
struct Foo
{
int y;
Foo2 f2;
Foo(int val, Foo2 f): y(val), f2(f) {}
Foo(int val): y(val), f2(val) {}
};
int main()
{
Foo f(1);
}
您可以使用模板来解决这个问题:
struct Foo2
{
Foo2(int val)
{}
};
template <int val>
struct Foo
{
Foo(Foo2 f = Foo2(val))
{}
};
int main()
{
Foo<1> f = Foo<1>();
return 0;
}
根据 C++ 标准(8.3.6 默认参数):
9 Default arguments are evaluated each time the function is called. The order of evaluation of function arguments is unspecified. Consequently, parameters of a function shall not be used in a default argument, even if they are not evaluated. Parameters of a function declared before a default argument are in scope and can hide namespace and class member names.
在任何 C++(不仅是 C++ 2014)中,您都可以重载构造函数。例如
struct Foo
{
Foo(int val )
{ Foo2 f(val); /*...*/ }
Foo(int val, Foo2 f )
{}
};
或者您可以使用委托构造函数(如果您的编译器支持新标准)
struct Foo
{
Foo(int val ) : Foo( val, Foo2( val ) )
{}
Foo(int val, Foo2 f )
{}
};