Необъяснимое поведение функции, принимающей универсальную ссылку и возвращающей константную ссылку - PullRequest
0 голосов
/ 26 апреля 2018

Я всегда думал, что следующая функция, которая принимает универсальную ссылку, должна возвращать 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>&.

Почему это? Какое правило я пропустил? Заранее спасибо!

1 Ответ

0 голосов
/ 26 апреля 2018

универсальная ссылка

Нет, они называются "отправка ссылок" . Термин «универсальная ссылка» устарел.


Почему это?

Когда вы вызываете Const(x), x является lvalue, поэтому T выводится как int&. Ваш тип возврата становится:

  • const T & = T const & -> int & const & -> int &

int & const & является ссылкой на const ссылку на int, которая совпадает с int&. (В этом случае const относится к int&, а не только к int, как T = int&) .

...