const применяется к параметру "универсальная ссылка"

Я наткнулся на статью Скотта Майерса об универсальных ссылках, ссылку.

Из того, что я понял универсальная ссылка, это какой-то тип T&& может означать тип rvalue или lvalue в разных контекстах.

Например:

template<typename T>
void f(T&& param);               // deduced parameter type ⇒ type deduction;
                                 // && ≡ universal reference

В приведенном выше примере в зависимости от параметра шаблона T&& может быть lvalue или rvalue, то есть это зависит от того, как мы называем f

int x = 10;
f(x); // T&& is lvalue (reference)
f(10); // T&& is rvalue

Однако, по словам Скотта, если мы применим const к приведенному выше примеру типа T&& всегда является значением:

template<typename T>
void f(const T&& param);               // “&&” means rvalue reference

Цитата из статьи:

Даже простого добавления квалификатора const достаточно, чтобы отключить интерпретацию "&&" как универсальной ссылки:

Вопрос: почему const сделать "универсальное" ссылочное значение?

Я думаю, что это невозможно, потому что следующий код создает путаницу:

template<typename T>
void f(const T&& param);               // “&&” means rvalue reference

int x = 10;
f(x); // T&& is lvalue (reference) // how does 'x' suddenly become an rvalue because of const?
f(10); // T&& is rvalue // OK

0 ответов

Другие вопросы по тегам