Список построения и инициализации: что делает компилятор?

У меня есть несколько вопросов о конструкторах в C ++. Для каждого вопроса (от (1) до (4)) я хотел бы знать, правильно ли определено поведение по отношению к стандарту.

А) Первый касается инициализации членов:

class Class
{
public:
Class()
: _x(0)
, _y(_x)
, _z(_y) // <- (1) Can I initialize a member with other members ?
{
;
}

protected:
int _x;
int _y;
int _z;
};

Б) Какие функции добавлены в каждый класс компилятором?

template<typename T> class Class
{
public:
template<typename T0>
Class(const Class<T0>& other)
{
std::cout<<"My copy constructor"<<std::endl;
_x = other._x;
}

template<typename T0 = T>
Class (const T0 var = 0)
{
std::cout<<"My normal constructor"<<std::endl;
_x = var;
}

public:
T _x;
};

// (2) Are
// Class(const Class<T>& other)
// AND
// inline Class<T>& operator=(const Class<T>& other)
// the only functions automatically added by the compiler ?

В качестве примера, если я позвоню:

Class<int> a;
Class<int> b(a); // <- Will not write "My copy constructor"Class<double> c(a); // <- Will write "My copy constructor"

(3) Является ли это поведение совершенно нормальным в соответствии со стандартом?

(4) Есть ли у меня гарантия, что пустой конструктор не будет добавлен автоматически и что Class<int> x; напишет "My normal constructor" ?

3

Решение

Могу ли я инициализировать участника с другими участниками?

Да, если эти другие члены уже инициализированы; то есть до тех пор, пока их декларации предшествуют инициализации члена.

Являются ли [конструктор копирования] и [оператор копирования-назначения] единственными функциями, автоматически добавляемыми компилятором?

Это также неявно объявит деструктор, который уничтожит _x используя его деструктор.

В C ++ 11 конструктор перемещения (Class(Class&&)) и оператор присваивания (Class& operator=(Class&&)) также объявляются неявно, если только вы не объявляете конструктор копирования или перемещения или оператор присваивания копирования или перемещения.

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

Class<T1> t1;
Class<T1>(t1); // prints nothing
Class<T2>(t1); // prints "My copy constructor" (which is a lie)

Это поведение совершенно нормально в соответствии со стандартом?

Да, см. Главу 12.

Есть ли у меня гарантия, что пустой конструктор не будет добавлен автоматически и что Class<int> x; напишет "My normal constructor" ?

Да, конструктор по умолчанию будет объявлен неявно только в том случае, если вы вообще не объявите никаких конструкторов.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]