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