Ответ 1
Это так. Для типа T
, T()
значение инициализирует "объект" типа T
и дает выражение rvalue.
int a = int();
assert(a == 0);
То же самое для под-классов:
struct A { int a; };
assert(A().a == 0);
Также верно для некоторых не-POD-классов, у которых нет объявленного конструктора:
struct A { ~A() { } int a; };
assert(A().a == 0);
Так как вы не можете сделать A a()
(вместо этого создается объявление функции), boost имеет класс value_initialized
, позволяющий обойти что, и С++ 1x будет иметь следующий, альтернативный синтаксис
int a{};
В сухих словах Стандарта это звучит как
Выражение T(), где T является спецификатором простого типа (7.1.5.2) для типа объекта без массива или типа (void cv-qualified) void, создает rvalue указанного типа, который инициализируется значением
Так как typedef-name - это имя типа, которое является самим спецификатором простого типа, это работает отлично.