Почему в некоторых случаях cv-квалификаторы удаляются из типа, возвращаемого функцией? - PullRequest
6 голосов
/ 29 сентября 2019

Посмотрите на этот простой пример:

template <typename T>
const T const_create() {
    return T();
}

struct Foo { };

int main() {
    auto &x = const_create<Foo>(); // compiles
    // auto &x = const_create<int>(); // doesn't compile
}

Почему версия с Foo компилируется, а с int нет?Другими словами, почему const удаляется из типа возврата const_create<int>?Это работает как если бы он вернул int, а не const int.Разве это не противоречие в языке?

Где стандарт предписывает такое поведение?

1 Ответ

8 голосов
/ 29 сентября 2019

[expr] / 6 говорит:

Если значение prvalue изначально имеет тип « cv T», где Tcv-неквалифицированный неклассный, не относящийся к массиву тип , тип выражения корректируется до T перед любым дальнейшим анализом.

Следовательно, const Foo prvalue равно const Foo, но const int prvalue настроено на int.


Это правило введено в C ++ 14 (сравните N3337 [basic.lval] /4 с N4140 [expr] / 6 ) CWG 1261 .

...