Я не понимаю, как работают правила инициализации С++ 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 использует инициализацию стиля С++ 11, которая вызывает конструктор Position. Но как это может повлиять на возможность оставить ссылочный член неинициализированным?
(Обновление) Составитель: gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2