Ключевое слово const в возвращаемом значении

MSVC позволяет декларировать тип возвращаемого значения функции c использованием ключевого слова const. Учитывая, что такой реализации не предусмотрено в документации MS C++ (возможно в синтаксисе она и присутствует, но я еще не на той стадии, чтобы понимать что в этой графе описывается), ожидается, что const в данном случае будет реализовывать функционал constexpr.

const int F() {
  int value;
  std::cin >> value;
  return value;
}

Однако и вышеупомянутый написанный код успешно компилируется. Что происходит в данном примере? Кажется, использование const в данном примере бесполезно, хоть IDE и видит идентификатор F как const int.


Ответы (1 шт):

Автор решения: HolyBlackCat

Стандарт говорит, что prvalue (т.е., грубо говоря, временные объекты), тип которых - не класс и не массив, автоматически теряют const и volatile. Поэтому в вашем случае const ничего не делает.

А если возвращать из функции класс, то const вреден, потому что константный временный объект нельзя переместить, и он вместо этого будет втихую копироваться.


ожидается, что const в данном случае будет реализовывать функционал constexpr

Нет, это так не работает.

Однако и вышеупомянутый написанный код успешно компилируется.

А он даже с constexpr теперь компилируется, потому что в С++23 разрешили навешивать constexpr на почти любые функции. Если он неприменим, то просто тихо игнорируется.

→ Ссылка