Есть. Для типа 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
, позволяя обойти это, и C ++ 1x будет иметь следующий альтернативный синтаксис
int a{};
В сухих словах стандарта это звучит как
выражение T (), где T является спецификатором простого типа (7.1.5.2) для типа объекта, не являющегося полным массивом, или (возможно, cv-квалифицированного) типа void, создает rvalue указанного типа,
#include <iostream>
struct Foo {
char bar;
char baz;
char foobar;
// the struct is a POD
//virtual void a() { bar='b'; }
};
int main() {
Foo o1;
Foo o2 = Foo();
std::cout << "O1: " << (int)o1.bar <<" "<< (int)o1.baz <<" "<< (int)o1.foobar << std::endl;
std::cout << "O2: " << (int)o2.bar <<" "<< (int)o2.baz <<" "<< (int)o2.foobar << std::endl;
return 0;
}
Вывод:
O1: -27 - 98 0
O2: 0 0 0
Adding () распространяет вызовы инициализатора на все элементы POD. Расшифровка виртуального метода изменяет вывод на:
O1: -44 -27-98
O2: -71-120 4
Однако добавление деструктора ~ Foo () не подавляет инициализацию, хотя создает не- Объект POD (вывод похож на первый).