考慮以下幾點:規則的匿名聚合
#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,鏘,和英特爾C++編譯所有它的罰款。但g++4.9 foo.cpp -std=c++11
告訴我:
14 : error: member 'MyType Wrapper::<anonymous struct>::t' with constructor not allowed in anonymous aggregate
MyType t;
^
Compilation failed
注意,static_assert
■確保MyType
是standard layout類型,trivial type,而且實際上是POD(注意,C++ 11後,莢都不允許有構造函數)。
我找不到任何關於匿名結構中允許的類型的權威性。我所發現的(大多數是在SO上)表明,作爲POD類型就足夠了。顯然,它不是。
我的問題:如果POD類型實際上不足以處於匿名結構中,那麼是足夠嗎?或者,因爲GCC與所有其他編譯器不同,這是GCC的問題嗎?
[不在Clang中編譯](http://melpon.org/wandbox/permlink/EymdTe46Ss7Sn1xA);不是格式良好的C++。 –
@KerrekSB:當您將匿名結構更改爲常規未命名結構時,它會[編譯](http://melpon.org/wandbox/permlink/4S88COP93nH4zyeV)。當然,我不確定OP是否能夠理解差異。(http://stackoverflow.com/q/14248044/734069)雖然我認爲他的問題主要是關於未命名結構中複雜類型的行爲,但OP在我們可以繼續之前需要澄清。 –
@NicolBolas我現在更好地理解術語。但是,問題仍然存在於哪些條件下 - GCC接受該代碼。顯然,這不是必需的 - 因爲只有未命名的結構是目前爲止的標準 - 但我很驚訝是POD類型是不夠的。 – imallett