РЕДАКТИРОВАТЬ: изменил мой вопрос на что-то более значимое
Если у меня есть класс:
class A{
public:
int nr;
int *a;
A();
};
A::A(): nr(0), a = new int[10]{}
Это суета, но если у меня есть
A::A(): nr(0) {a = new int[10];}
Оно работает. Пожалуйста, объясните мне это поведение.
nr(0)
инициализатор для элемента данных nr
,
{a = new T[10]; }
это тело конструктора, которое присваивает значение элементу данных a
после инициализация в списке инициализаторов выполнена.
{}
является пустым телом конструктора, это означает, что конструктор ничего не делает (кроме как инициализировать nr
конечно, так как это в списке инициализатора).
a = new int[10]
Между списком инициализатора и телом конструктора нет смысла, синтаксис языка не позволяет этого. Он не должен компилироваться, но если вы нашли компилятор, который его принимает, а затем он падает, вам придется обратиться к документации этого компилятора для объяснения.
Это должно выглядеть примерно так:
template<class T>
class A {
public:
int nr;
T *a;
A();
};
template<class T>
A<T>::A() : nr(0), a( new T[42]) { }
Ни один не должен компилироваться. Правильный путь был бы такой:
A::A(): nr( 0 ), a( new int[5] ){}
A<T>::A(): nr( 0 ), a( new T[10] ){}