Создание объекта с использованием анонимного временного
Мне было интересно, что происходит внутри при назначении анонимного объекта, временно именованного объекта:
#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) приводит к ошибке компиляции (вероятно, из-за того, что вы не можете выполнять функции-члены на указателе функции),
Извините, если это затянулось слишком долго, но что происходит внутри, когда вы делаете это?
Спасибо за ваше время!