下面的代码非常简单,我希望它能够很好地编译。
struct A
{
struct B
{
int i = 0;
};
B b;
A(const B& _b = B())
: b(_b)
{}
};
我用 g + + 版本4.7.2、4.8.1、 clang + + 3.2和3.3测试了这段代码。除了这段代码(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57770)上的 g + + 4.7.2 Segfault 这个事实之外,其他测试过的编译器提供的错误消息解释得不多。
G + + 4.8.1:
test.cpp: In constructor ‘constexpr A::B::B()’:
test.cpp:3:12: error: constructor required before non-static data member for ‘A::B::i’ has been parsed
struct B
^
test.cpp: At global scope:
test.cpp:11:23: note: synthesized method ‘constexpr A::B::B()’ first required here
A(const B& _b = B())
^
Clang + + 3.2和3.3:
test.cpp:11:21: error: defaulted default constructor of 'B' cannot be used by non-static data member initializer which appears before end of class definition
A(const B& _b = B())
^
让这段代码可编译是可能的,而且似乎没有什么区别。有两种选择:
struct B
{
int i = 0;
B(){} // using B()=default; works only for clang++
};
或者
struct B
{
int i;
B() : i(0) {} // classic c++98 initialization
};
这个代码是真的不正确还是编译器错了?