Пустой пользовательский конструктор перемещения

Следующий фрагмент кода, который я писал для понимания поведения перемещения CTOR, затрудняет мне понимание его вывода:

#include <iostream>

class Temp
{
  public:

    Temp(){
      std::cout << "Temp DEFAULT CTOR called" << std::endl;
      mp_Val = nullptr;
    }

    Temp(int inp) { 
      std::cout << "Temp CTOR called" << std::endl;
      mp_Val = new int(inp); 
    }

    Temp(const Temp& inp) {
      std::cout << "Temp COPY CTOR called" << std::endl;
      mp_Val = new int(*inp.mp_Val); 
    }

    Temp& operator= (const Temp& inp) {
      std::cout << "Temp ASSIGNMENT OPER called" << std::endl;
      mp_Val = new int(*inp.mp_Val);

      return *this;
    }

    int* mp_Val;
};

class B
{
  public:

    B(){
      std::cout << "Class B DEFAULT CTOR" << std::endl; 
      mp_Val = nullptr;
    }
    B(int inp) { 
      std::cout << "Class B CTOR" << std::endl; 
      mp_Val = new Temp(inp);
    }

    B(const B& in) { 
      std::cout << "Class B COPY CTOR" << std::endl; 
      mp_Val = in.mp_Val;
    }

     B(B&& in){ 
      std::cout << "Class B MOVE CTOR" << std::endl; //Doubt: 1
    }

    Temp *mp_Val;
};

int main() {
  B obj1(200);
  B obj2 = std::move(obj1);
  auto temp = obj1.mp_Val;
  std::cout << "Obj1 B::Temp address: " << obj1.mp_Val << std::endl;

  std::cout << "Obj2 B::Temp address: " << obj2.mp_Val << std::endl; //Doubt: 2

  return 0;
}

Выход:

Class B CTOR
Temp CTOR called
Class B MOVE CTOR
Obj1 B::Temp address: 0xd48030
Obj2 B::Temp address: 0x400880

Версия GCC: 4.6.3

Мой вопрос касается строки, обозначенной как Сомнение 2. Разве адрес не должен печататься как 0? Насколько я понимаю, я определил пустой ход CTOR (отмечен как Сомнение 1) в class B, он должен вызвать CTOR по умолчанию класса Temp (который не вызывает, как видно из журналов) для инициализации своей переменной-члена mp_Val типа Temp,

Очевидно, что-то, что мне не хватает.

1 ответ

Решение

Насколько я понимаю, я определил пустой ход CTOR (отмечен как Сомнение 1) в class B, он должен вызвать CTOR по умолчанию класса Temp (который не вызывает, как видно из журналов) для инициализации своей переменной-члена mp_Val типа Temp,

Ваша переменная-член не относится к типу Tempэто типа Temp *, Вы правы, что отсутствие инициализатора означает, что этот элемент будет создан по умолчанию, и для типа Temp это будет включать вызов конструктора по умолчанию. Однако для типов указателей конструкция по умолчанию оставляет объект неинициализированным.

Другие вопросы по тегам