다음 코드는 매우 사소하며 잘 컴파일되어야한다고 예상했습니다.
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
};
이 코드가 정말 잘못되었거나 컴파일러가 잘못 되었습니까?
internal compiler error: Segmentation fault
...이 코드에