Abc &obj11 = fun1();
Эта линия делает программу плохо сформированной; спецификация C++ запрещает привязку временных ссылок к ссылке, которая не является const
. Соответствующий компилятор C++ испускает ошибку. Предположительно, вы используете компилятор Microsoft Visual C++, который хорошо известен тем, что позволяет связывать временную ссылку с номером const
, что противоречит спецификации C++.
const Abc &obj11 = fun1();
Эта линия будет хорошо сформирована, и это приведет к временной привязке к ссылке.
В любом случае при привязке временного к ссылке временное время продлевается до соответствия времени жизни ссылки, поэтому, когда ссылка выходит за пределы области действия, временная также будет уничтожена. Другими словами, в терминах семантики жизни это эквивалентно строке Abc obj1 = fun1();
. Если вы используете компилятор, который копирует копии, все копии будут удалены в обоих случаях. Если не eliding копии, то базовый вариант будет включать в себя один меньше копию:
- значение случай, возвращенный объект будет скопирован в временный, а затем уничтожаются, и временные будут скопированы в
obj1
, а затем уничтожаются.
- Ссылочный случай, возвращенный объект будет скопирован во временный, а затем уничтожен, а временный будет привязан к ссылке.
Обратите внимание, что достойный оптимизирующий компилятор полностью оптимизирует все копии, а также ссылочную деталь, оставляя вас с идентичным сборочным результатом для обоих случаев в вашем вопросе.
(Если вы заинтересованы, here is a test case с кодом слегка подправили от этого в вашем вопросе. Обратите внимание, что копии не принимаются в любом случае, если копия элизия не отключена.)
Обратите внимание, что это отличается от кода Abc obj1; obj1 = fun1();
в вашем вопросе. Я намеренно изменил его, потому что написанный вами код напрямую не сопоставим, поэтому сравнивать их не имеет смысла. Если вы перепишете его как Abc obj1 = fun1();
, тогда можно сравнить две строки, потому что Abc obj1; obj1 = fun1();
включает в себя построение по умолчанию и затем назначение копии.
Не следует компилировать? – Columbo
Я думаю, что в декларации ссылок отсутствует 'const'. –
его не компилируется.http: //ideone.com/QSrlb1 – Ankur