Конструктор копирования в конструкторе копирования. Почему нельзя вызвать?

Собственно вопрос в коде:

class a
{
public:
   a() = default;
   a(a &oth)
   {
   }

private:
   int a_;
};


class b
{
public:
   b() = default;
   b(b &oth)
   {      
      a_(oth.a_);   // Почему не удается вызвать конструктор копирования здесь??
   }

   a a_;
};

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Для поля a_ конструктор уже вызван раньше, между скобками ) {. Это не шутка, все поля класса конструируются до начала исполнения тела конструктора, b(b &oth) /* вот тут */ {. А дважды вызывать конструктор нельзя - язык запрещает. Поместите в это место список инициализации:

b(b &oth) : a_(oth.a_) {}

→ Ссылка