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