ユニバーサル リファレンスに関するScott Mayers の記事を偶然見つけました。
私が理解した普遍的な参照から、それはいくつかの型T&&
が異なるコンテキストで右辺値または左辺値型を意味する可能性があるということです。
例えば:
template<typename T>
void f(T&& param); // deduced parameter type ⇒ type deduction;
// && ≡ universal reference
上記の例では、テンプレート パラメーターに応じてT&&
、左辺値または右辺値のいずれかになります。つまり、呼び出し方によって異なります。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