Создание объекта с использованием анонимного временного

Мне было интересно, что происходит внутри при назначении анонимного объекта, временно именованного объекта:

#include <iostream>

class Object {
public:
  Object (void) {
    this->PrintAddress();
  }
  Object (const Object& another_object) {
    std::cout << "Copy constructor is called!\n";
  }
  ~Object (void) noexcept {}
  void PrintAddress (void) const {
    std::cout << "Object Address: " << this << '\n';
  }
};

int main (int arg_count, char* arg_vector[]) {
  // The following line:
  Object object = Object();
  object.PrintAddress();
  return 0;
}

Компиляция и выполнение результирующего двоичного файла показывает, что конструктор копирования не вызывается, и именованный объект ("объект") и временный RHS имеют один и тот же адрес, что означает, что они являются одним и тем же объектом. Я как-то чувствую, что компилятор связывает временное имя с тем, почему не выполняется конструктор (кроме случаев создания временного RHS). Чтобы лучше это увидеть, взгляните на следующее:

Object object (Object()); // Line 1
object.PrintAddress() // Line 2

Обратите внимание, что хотя строка 1 имеет тот же синтаксис, что и объект, который выполняет конструктор копирования, она также имеет синтаксис, напоминающий указатель на функцию. Комментирование строки 2 не влияет на способность программы компилировать, но раскомментирование строки 2 (при условии, что я только что создал объект с именем object) приводит к ошибке компиляции (вероятно, из-за того, что вы не можете выполнять функции-члены на указателе функции),

Извините, если это затянулось слишком долго, но что происходит внутри, когда вы делаете это?

Спасибо за ваше время!

0 ответов

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