2016-11-24 16 views
4
struct A1 
{ 
    int n;   
}; 

struct A2 
{ 
    int n; 
    A2(){}   
}; 

struct A3 
{ 
    int n; 
    A3() = default;   
}; 

Вопрос 1:Являются ли они эквивалентными между неявным ctor, no-parameter-empty-body ctor и явным значением по умолчанию ctor?

ли C++ стандартная гарантия классов A1, A2, A3 полностью эквивалентны друг другу?

Вопрос 2:

A1 a1; 
A2 a2; 
A3 a3; 

Будет ли компилятор не нулевой инициализации a1.n, a2.n, a3.n в соответствии со стандартом C++?

+2

Не уверен, что вы подразумеваете под этим .. они не равны, например, первая - это совокупность, а вторая - –

ответ

2

Есть одна разница в том, что A1 и A3 - aggregate type, а A2 - нет, поскольку он имеет определяемый пользователем конструктор.

тип класса (как правило, структура или объединение), который имеет

  • ...
  • нет пользователя при условии , inherited, or explicit (since C++17) Конструкторов (explicitly defaulted or deleted constructors are allowed) (since C++11)
  • ...

Это означает для A1 и A3 они coul d быть объединенным, а A2 не может.

A1 a1{99}; // fine; n is initialized to 99 
A3 a3{99}; // fine; n is initialized to 99 
A2 a2{99}; // error; no matching constructor taking int found 

Будет ли компилятор не нулевой инициализации a1.n, a2.n, a3.n в соответствии со стандартом C++?

В соответствии с правилом default initialization, если они имеют продолжительность автоматического хранения, здесь нет нулевой инициализации, все значения будут неопределенными. С другой стороны, статические и поточно-локальные объекты получают zero initialized.

2

Они не равны, так как они являются различными объектами и имеют различные инициализации: первый и последний являются агрегатами, второго не

Агрегат представляет собой массив или класс (пункт 9) с без конструкторов, предоставляемых пользователем (12.1), без элементарных элементов для нестатических данных (9.2), без частных или защищенных нестатических данных (раздел 11), без базовых классов (раздел 10), и нет виртуальных функций (10.3).

Подробнее об этом здесь: What are Aggregates and PODs and how/why are they special?

Так агрегатный инициализация работает A1 и A3, это не для A2

struct A1 
{ 
    int n;   
}; 

struct A2 
{ 
    int n; 
    A2(){}   
}; 

struct A3 
{ 
    int n; 
    A3() = default;   
}; 


int main() 
{ 
    A1 obj1{42}; 
    //A2 obj2{42}; // error 
    A3 obj3{42}; 


    return 0; 
} 

A1 a1; A2 a2; A3 a3;

Будет ли компилятор не нулевой инициализации a1.n, a2.n, a3.n согласно C++ стандартной

Переменные будут default initialized.