У меня есть тот же вопрос, что и this post, но когда я пошел проверить верхний ответ, я не получил ожидаемых результатов.Вызов конструктора в C++
У меня есть следующий класс:
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 ref), тогда как временный объект является rvalue?
http://en.cppreference.com/w/cpp/language/copy_elision C++ не должны вызывать конструкторы, когда это на самом деле не нужно. – xaxxon
Сотни дубликатов. –
'g ++ -fno-elide-constructors' –