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 = 0wenn 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.
Bscheint diese Arbeit in zu machen gcc 4.7.
internal compiler error: Segmentation faultzu diesem Code ...