LINUX.ORG.RU

с++ возврат const объекта

 


0

2

Для каких целей может понадобиться возвращать константный объект? [code] struct Shit { Shit() { } }; const getShit() { return Shit(); } [/code] В учебнике написано "нельзя его изменять в выражении вызова. Для чего это все нужно?

Когда возвращаемый объект большой, и не охота его копировать.

anonymous
()

Самое главное по-моему, это то, что при возврате постоянных объектов компилятор может сам додуматься до оптимизации, в частности может и просто передать владение, вместо копирования.

AKonia ★★
()

В учебнике написано «нельзя его изменять в выражении вызова»

getShit().x = 1

и с неконстантным возвратом не получится, т.к. возвращается rvalue.

seiken ★★★★★
()
Ответ на: комментарий от AKonia

Самое главное по-моему, это то, что при возврате постоянных объектов компилятор может сам додуматься до оптимизации, в частности может и просто передать владение, вместо копирования.

он это может сделать даже если не const. Есть такая техника, и от const она не зависит.

Зачем возвращать const? Не знаю.

former_anonymous ★★★
()
Ответ на: комментарий от Assembler

Ага. Я читал Брюса Эккеля «Философия с++», у него там описано, что все временные объекты это const. Хотя в другом месте написано, что это ошибка.

patriarh_kuril
() автор топика
Ответ на: комментарий от deep-purple

Вот цитата из книги

Временные объекты Иногда в процессе вычисления выражения компилятору приходится создавать временные объекты. Эти объекты принципиально не отличаются от других объектов: они также требуют выделения памяти, конструируются и уничтожаются. Отличие состоит в том, что эти объекты остаются невидимыми для программиста, — компилятор сам решает, когда они нужны, и определяет все аспекты их существования. Но у временных объектов есть одна важная особенность: они автоматически являются константными. Поскольку обычно вы не можете получить доступ к временному объекту, выполнение каких-либо операций, изменяющих состояние временного объекта, почти наверняка является ошибкой, потому что эту информацию все равно не удастся использовать. Автоматически объявляя все временные объекты константными, компилятор сможет сообщить вам об этой ошибке

patriarh_kuril
() автор топика

как минимум это нужно для полноты семантики. если можно вернуть просто объект, то в силу равноправия константных и неконстантных обьектов надо, чтобы было можно вернуть и константный объект. опять же если возвращается константный объект у него нельзя будет вызвать неконстатные методы. зачем это нужно…пути фантазии неисповедимы. например вы пишете публичный метод, что возвращает некий прокси обьект на что-то, но вы не хотите чтобы кто-то использовал неконстантные методы этого прокси. в этом случае вы вернете константный прокси.

alysnix ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.