objective возврата значения const?

В чем цель const в этом?

const Object myFunc(){ return myObject; } 

Я только что начал читать Effective C ++, а пункт 3 защищает это, и поиск в Google поднимает аналогичные предложения, но также и контрпримеры. Я не вижу, как использование const здесь было бы предпочтительнее. Предполагая, что возrotation по значению желательно, я не вижу причин для защиты возвращаемого значения. Приведенный пример, почему это может быть полезно, – это предотrotation непреднамеренных отклонений bool от возвращаемого значения. Фактическая проблема заключается в том, что неявные команды bool должны быть предотвращены с явным ключевым словом.

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

Что получается при использовании const здесь и когда было бы предпочтительнее?

EDIT: Измените пример арифметики на любую функцию, которая изменяет объект, который вы хотите выполнить перед назначением.

В гипотетической ситуации, когда вы могли бы выполнить потенциально дорогостоящую неконстантную операцию над объектом, возврат константным значением предотвращает случайное обращение этой операции к временному. Представьте, что + возвратил неконстантное значение, и вы могли бы написать:

 (a + b).expensive(); 

Однако в возрасте C ++ 11 настоятельно рекомендуется возвращать значения как неконстантные, чтобы вы могли в полной мере использовать ссылки rvalue, которые имеют смысл только на непостоянных значениях r.

Таким образом, существует обоснование этой практики, но она существенно устарела.

Это довольно бессмысленно возвращать значение const из функции.

Трудно заставить его повлиять на ваш код:

 const int foo() { return 3; } int main() { int x = foo(); // copies happily x = 4; } 

и :

 const int foo() { return 3; } int main() { foo() = 4; // not valid anyway for built-in types } // error: lvalue required as left operand of assignment 

Хотя вы можете заметить, что тип возвращаемого значения является определяемым пользователем типом :

 struct T {}; const T foo() { return T(); } int main() { foo() = T(); } // error: passing 'const T' as 'this' argument of 'T& T::operator=(const T&)' discards qualifiers 

сомнительно, имеет ли это какое-либо преимущество для всех.

Возrotation ссылки отличается, но если Object является параметром шаблона, вы этого не делаете.

Он гарантирует, что возвращаемый объект (который является RValue в этой точке) не может быть изменен. Это гарантирует, что пользователь не может так думать:

 myFunc() = Object(...); 

Это будет хорошо работать, если myFunc вернется по ссылке, но почти наверняка будет ошибкой при myFunc значения (и, вероятно, не будет улавливаться компилятором). Конечно, в C ++ 11 с его rvalues ​​это соглашение не имеет такого большого смысла, как раньше, поскольку объект const нельзя перенести, так что это может иметь довольно сильные последствия для производительности.

C ++ 11 делает его весьма полезным для объектов только для перемещения. Например:

 const std::unique_ptr myFunc(); 

unique_ptr – тип, который нельзя скопировать; его можно только перемещать. Но вы не можете вызвать std::move по типу const . Следовательно, единственный способ сохранить это – с const& или const&& :

 const std::unique_ptr &ptr = myFunc(); 

Поскольку это const unique_ptr , его нельзя перенести. Не может быть скопировано. Это означает, что очень трудно фактически сохранить это в любом месте в долгосрочной перспективе. Вы можете положить его в стек. Но сделать его членом classа невозможно (без вызова неопределенного поведения).

Таким образом, можно гарантировать, что указатель не будет храниться в течение длительного времени. Это позволяет создать специализированную версию unique_ptr который на деле не удаляет память. Таким образом, функция может возвращать указатель, зная, что пользователь не может его хранить в любом месте.

Конечно, это также затрудняет возврат вызывающего абонента. Таким образом, есть недостатки.

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

Хотя любой оптимизатор, скорее всего, оптимизирует его в любом случае …

myObject может быть указателем. «Const» защищает значение, указанное myObject.

  • Почему не используется оператор const для STL-карт?
  • Как преобразовать «указатель на тип указателя» в const?
  • Каков тип строковых литералов в C и C ++?
  • Верхний уровень const не влияет на сигнатуру функции
  • «Const» означает только чтение или что-то еще?
  • Как удалить дублирование кода между аналогичными функциями const и non-const?
  • Измененный массив в области файлов
  • Почему у C ++ нет конструктора const?
  • C ++: ссылка const, перед vs после спецификатора типа
  • Почему я не могу преобразовать 'char **' в 'const char * const *' в C?
  • Почему элементы const должны быть инициализированы в инициализаторе конструктора, а не в его теле?
  • Давайте будем гением компьютера.