我不明白C++11中大括号初始化规则在这里是如何工作的。 有以下代码:
struct Position_pod {
int x,y,z;
};
class Position {
public:
Position(int x=0, int y=0, int z=0):x(x),y(y),z(z){}
int x,y,z;
};
struct text_descriptor {
int id;
Position_pod pos;
const int &constNum;
};
struct text_descriptor td[3] = {
{0, {465,223}, 123},
{1, {465,262}, 123},
};
int main()
{
return 0;
}
请注意,该数组被声明为拥有3个元素,但仅提供了2个初始值。
然而,它在编译时没有错误,这听起来很奇怪,因为最后一个数组元素的引用成员将未初始化。实际上,它具有NULL值:
(gdb) p td[2].constNum
$2 = (const int &) @0x0: <error reading variable>
现在来看看“魔法”:我将Position_pod更改为Position
struct text_descriptor {
int id;
Position_pod pos;
const int &constNum;
};
变成这个样子:
struct text_descriptor {
int id;
Position pos;
const int &constNum;
};
现在它会给出预期的错误:
error: uninitialized const member ‘text_descriptor::constNum'
我的问题是:为什么在第一种情况下编译通过,而在第二种情况下应该会出现错误。
区别在于,Position_pod 使用了 C 风格的花括号初始化方式,而 Position 使用了 C++11 的初始化方式,这会调用 Position 的构造函数。但这如何影响未初始化引用成员的可能性?(更新) 编译器: gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
-std=c++03
编译它。 - user743382