为什么 typedef struct 允许默认初始化程序?
Why does typedef struct allow default initializer?
所以,结构可以有默认的初始值设定项。然而,据我所知,typedef 应该不能。尽管如此,以下编译(C++11、g++ 5.4、6 和 7)。
typedef struct {
uint8_t foo[6] = {'M', 'A', 'R', 'K', 'E', 'R'};
uint8_t bar;
uint32_t baz;
} MyStruct;
编译器是否定义和声明了一个 MyStruct 类型的匿名结构,并带有 foo 的默认初始值设定项?如果是这样,bar 和 baz 是零初始化还是未初始化(CLion 警告 bar 和 baz 未初始化,但我怀疑这是错误的)?这是未定义的行为、g++ 扩展还是语言的特性?
As far as I understand, however, typedefs should not be able to [have default initializers].
typedef
只是一个类型的别名。它可以为具有默认 member 初始值设定项的类型起别名。
typedef struct {
uint8_t foo[6] = {'M', 'A', 'R', 'K', 'E', 'R'};
uint8_t bar;
uint32_t baz;
} MyStruct;
struct {...}
是结构的定义(即 class)。结构定义在 typedef 定义中。
Is the compiler defining and declaring an anonymous struct ... with a default initialzer ...?
是的。结构可以有默认的 member 初始值设定项。结构是未命名还是命名是无关紧要的。
Is this undefined behavior, a g++ extension, or a feature of the language?
这是定义明确的标准功能。
很好奇 C++11 添加的默认成员初始化器如何允许非默认构造未命名结构的成员(即 classes)——因为之前成员初始化器的唯一位置是在成员初始化中构造函数列表,并且没有用于为未命名结构声明构造函数的语法。
所以,结构可以有默认的初始值设定项。然而,据我所知,typedef 应该不能。尽管如此,以下编译(C++11、g++ 5.4、6 和 7)。
typedef struct {
uint8_t foo[6] = {'M', 'A', 'R', 'K', 'E', 'R'};
uint8_t bar;
uint32_t baz;
} MyStruct;
编译器是否定义和声明了一个 MyStruct 类型的匿名结构,并带有 foo 的默认初始值设定项?如果是这样,bar 和 baz 是零初始化还是未初始化(CLion 警告 bar 和 baz 未初始化,但我怀疑这是错误的)?这是未定义的行为、g++ 扩展还是语言的特性?
As far as I understand, however, typedefs should not be able to [have default initializers].
typedef
只是一个类型的别名。它可以为具有默认 member 初始值设定项的类型起别名。
typedef struct {
uint8_t foo[6] = {'M', 'A', 'R', 'K', 'E', 'R'};
uint8_t bar;
uint32_t baz;
} MyStruct;
struct {...}
是结构的定义(即 class)。结构定义在 typedef 定义中。
Is the compiler defining and declaring an anonymous struct ... with a default initialzer ...?
是的。结构可以有默认的 member 初始值设定项。结构是未命名还是命名是无关紧要的。
Is this undefined behavior, a g++ extension, or a feature of the language?
这是定义明确的标准功能。
很好奇 C++11 添加的默认成员初始化器如何允许非默认构造未命名结构的成员(即 classes)——因为之前成员初始化器的唯一位置是在成员初始化中构造函数列表,并且没有用于为未命名结构声明构造函数的语法。