Der folgende Code ist ziemlich trivial und ich habe erwartet, dass er gut kompiliert werden kann.
struct A
{
struct B
{
int i = 0;
};
B b;
A(const B& _b = B())
: b(_b)
{}
};
Ich habe diesen Code mit g ++ Version 4.7.2, 4.8.1, clang ++ 3.2 und 3.3 getestet. Abgesehen von der Tatsache, dass g ++ 4.7.2 Fehler in diesem Code aufweist ( http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57770 ), geben die anderen getesteten Compiler Fehlermeldungen aus, die nicht viel erklären.
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 und 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())
^
Es ist möglich, diesen Code kompilierbar zu machen, und es scheint, dass dies keinen Unterschied machen sollte. Es gibt zwei Möglichkeiten:
struct B
{
int i = 0;
B(){} // using B()=default; works only for clang++
};
oder
struct B
{
int i;
B() : i(0) {} // classic c++98 initialization
};
Ist dieser Code wirklich falsch oder sind die Compiler falsch?
int i = 0
wenn dies der Fall ist static const int i = 0
.
B()
als Funktionsaufruf für einen Konstruktor zu betrachten. Sie "rufen" niemals direkt einen Konstruktor auf. Stellen Sie sich dies als eine spezielle Syntax vor, die ein temporäres Element erstellt B
... und der Konstruktor wird nur als ein Teil dieses Prozesses aufgerufen, tief innerhalb des folgenden Mechanismus.
B
scheint diese Arbeit in zu machen gcc 4.7
.
internal compiler error: Segmentation fault
zu diesem Code ...