По сути, у меня тот же вопрос, что и в этом сообщении, но когда я пошел тестировать лучший ответ, я не получил ожидаемых результатов.
У меня есть следующий класс:
class Test
{
public:
Test()
{
std::cout << "default constructor" << std::endl;
}
Test(const Test &other)
{
std::cout << "copy constructor" << std::endl;
}
Test& operator=(const Test &other)
{
std::cout << "assignment operator" << std::endl;
return *this;
}
~Test()
{
std::cout << "destructor" << std::endl;
}
};
просто для отслеживания вызываемых конструкторов. Затем у меня есть следующий код в основном:
Test t1 = Test();
Основываясь на ответе в связанном посте, я ожидаю четыре строки вывода: одну для создания временного объекта по умолчанию, одну для копирования и два вызова деструктора: одну для уничтожения временного объекта и другую для t1. Однако я получаю только две строки: «конструктор по умолчанию» и «деструктор», предположительно обе для t1 после выхода из main(). Кто-нибудь может подробно объяснить, что происходит? Может ли кто-нибудь также объяснить, почему здесь используется оператор присваивания? Разве он не должен ожидать lvalue (потому что для этого требуется ссылка lvalue), тогда как временный объект является rvalue?