在 C++11 中,我们可以使用“brace-or-equal-initializer”(标准中的词)进行类内初始化,如下所示:
struct Foo
{
/*explicit*/ Foo(int) {}
};
struct Bar
{
Foo foo = { 42 };
};
但是如果我们取消注释explicit
,它就不再编译了。GCC 4.7 和 4.9 是这样说的:
error: converting to ‘Foo’ from initializer list would use explicit constructor ‘Foo::Foo(int)’
我发现这很令人惊讶。这段代码不能编译真的是 C++11 标准的意图吗?
删除=
修复它:Foo foo { 42 };
但我个人觉得这很难向几十年来习惯于这种形式的人解释=
,而且由于标准指的是“大括号或相等初始化器”,为什么好的旧方法并不明显在这种情况下不起作用。