Подтвердить что ты не робот

Почему const && перегружает as_const?

В блоге о прогрессе С++ 17 Я прочитал следующее:

P0007 предлагает шаблон вспомогательной функции as_const, который просто берет ссылку и возвращает ее как ссылку на const.

template <typename T> std::add_const_t<T>& as_const(T& t) { return t }
template <typename T> void as_const(T const&&) = delete;

Почему удалена перезагрузка const&&?

4b9b3361

Ответ 1

Посмотрите, что произойдет, если у вас нет этой перегрузки, и попробуйте передать const rvalue:

template <typename T> const T &as_const(T &t) { return t; }
struct S { };
const S f() { return S{}; }
int main() {
  // auto & ref = as_const(S()); // correctly detected as invalid already
  auto & ref = as_const(f()); // accepted
}

Это будет принято, потому что T будет выводиться как const S, а временные файлы могут привязываться к const S &. Результатом будет то, что вы случайно получите ссылку lvalue на временную, которая будет уничтожена сразу после инициализации ref. Почти все пользователи, принимающие lvalues ​​(независимо от того, являются ли переменные или функциональные параметры), не ожидают, что будут переданы временные; молчание принятия временных средств означает, что вы легко беззвучно обманываете ссылки.