Beachten Sie Folgendes:Regeln für Anonymous Aggregates
#include <type_traits>
struct MyType {
int val;
MyType(void) = default;
MyType(int v) : val(v) {}
};
static_assert(std::is_standard_layout<MyType>::value,"Implementation error!");
static_assert(std::is_trivial<MyType>::value,"Implementation error!");
static_assert(std::is_pod<MyType>::value,"Implementation error!");
struct Wrapper {
struct {
MyType t;
};
};
MSVC, Clang und Intel C++ alle es gut kompilieren. Aber g++4.9 foo.cpp -std=c++11
sagt mir:
14 : error: member 'MyType Wrapper::<anonymous struct>::t' with constructor not allowed in anonymous aggregate
MyType t;
^
Compilation failed
Beachten Sie, dass die static_assert
s sicherzustellen, dass MyType
ist ein standard layout Typ, ein trivial type, und darüber hinaus tatsächlich POD ist (beachten Sie, dass nach C++ 11, PODs sind erlaubt Konstrukteuren zu haben).
Ich konnte nichts autoritatives darüber finden, welche Typen in anonymen Strukturen erlaubt sind. Was ich gefunden habe (meistens hier auf SO), legt nahe, dass ein POD-Typ ausreichend ist. Offensichtlich ist es nicht.
Meine Frage: Wenn ein POD-Typ tatsächlich nicht ausreicht, um in einer anonymen Struktur zu sein, was ist ist ausreichend? Oder ist GCC, da es sich von allen anderen Compilern unterscheidet, ein Problem mit GCC?
[Kompiliert nicht in Clang] (http://melpon.org/wandbox/permlink/EymdTe46Ss7Sn1xA); ist nicht gut ausgebildet C++. –
@KerrekSB: Es [kompiliert] (http://melpon.org/wandbox/permlink/4S88COP93nH4zyeV), wenn Sie die anonyme Struktur in eine reguläre unbenannte Struktur ändern. Zugegeben, ich bin mir nicht sicher, ob der OP [den Unterschied versteht.] (Http://stackoverflow.com/q/14248044/734069) Während ich denke, seine Frage ist hauptsächlich über das Verhalten von komplexen Typen in unbenannten Strukturen, der OP muss dies klären, bevor wir fortfahren können. –
@ NicolBolas Ich verstehe jetzt besser die Terminologie. Die Frage ist jedoch immer noch, unter welchen Bedingungen-GCC-akzeptiert-den-Code.Offensichtlich ist es nicht erforderlich - da nur unbenannte Strukturen bisher Standard sind - aber ich bin überrascht, dass ein POD-Typ nicht ausreicht. – imallett