1

У меня есть тот же вопрос, что и 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?

+3

http://en.cppreference.com/w/cpp/language/copy_elision C++ не должны вызывать конструкторы, когда это на самом деле не нужно. – xaxxon

+2

Сотни дубликатов. –

+0

'g ++ -fno-elide-constructors' –

ответ

3

C++ не требует вызова конструкторов, когда это на самом деле не требуется. В вашем случае он знает, что объект создается с результатами вызова справа, поэтому он пропускает промежуточные шаги.

Вы можете увидеть ожидаемые результаты, добавив флаг -fno-elide-constructors, но вы никогда не должны делать этого на практике.

http://en.cppreference.com/w/cpp/language/copy_elision

увидеть его вживую: http://melpon.org/wandbox/permlink/OoxFy1dV6LB3QDbH

 Смежные вопросы

  • Нет связанных вопросов^_^