Ответ 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 (независимо от того, являются ли переменные или функциональные параметры), не ожидают, что будут переданы временные; молчание принятия временных средств означает, что вы легко беззвучно обманываете ссылки.