Я всегда думал, что следующая функция, которая принимает универсальную ссылку, должна возвращать const-ссылку.
template <typename T>
const T& Const(T&& val)
{
return val;
}
Однако следующий код успешно компилируется с VS C ++ и gcc:
int x = 5;
Const(x) = 6;
Значение переменной x равно 6 после запуска. Таким образом, функция Const возвращает неконстантную ссылку.
Чтобы получить ошибку компилятора, необходимо изменить функцию Const, чтобы она принимала обычную ссылку на l-значение, или чтобы она была объявлена как возвращающая const std::remove_reference_t<T>&
.
Почему это? Какое правило я пропустил?
Заранее спасибо!