考虑以下几点:规则的匿名聚合
#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