С ++ выполняет инициализацию значения для POD typedef? - PullRequest
9 голосов
/ 25 мая 2009

C ++ выполняет инициализацию значения на простых POD typedefs?

Предполагая

typedef T* Ptr;

делает

Ptr()

сделать инициализацию значения и гарантировать равным (T*)0?

, например

Ptr p = Ptr();
return Ptr();

Ответы [ 2 ]

17 голосов
/ 25 мая 2009

Это так. Для типа 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 - это имя типа, которое само является спецификатором простого типа, это прекрасно работает.

2 голосов
/ 25 мая 2009
#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

Добавление () передает вызовы инициализатора всем членам POD. Раскомментирование виртуального метода изменяет вывод на:

O1: -44 -27 -98

O2: -71 -120 4

Однако добавление деструктора ~ Foo () не подавляет инициализацию, хотя создает объект не POD (вывод похож на первый).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...