C++ делает инициализацию значения определения типа POD?

Использование:

$('#checkbox').attr('checked')
9
задан Community 23 May 2017 в 12:19
поделиться

2 ответа

Есть. Для типа 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 указанного типа,

17
ответ дан 4 December 2019 в 11:08
поделиться
#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 (вывод похож на первый).

2
ответ дан 4 December 2019 в 11:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: