32

左辺値または右辺値型参照パラメーターのいずれかに割り当てられた引数にもかかわらず、ユニバーサル参照と呼ばれる何かが間にあると言われているc++ 11および14に関するスコットの最後のマスターピースのユニバーサル参照について読んでいます。渡された引数の型特性に基づく l/rvalue のいずれか。const T&& pパラメータをユニバーサル参照にする理由は理解できましたが、型パラメータに const を追加すると p が右辺値になる理由がわかりません。

template<typename T>
void f(T&& param); // param is an universal reference

template<typename T>
void f(const T&& param); // param is an rvalue reference

const参照パラメータに割り当てられた場合、これ以上のことを行います。

4

1 に答える 1

26

正式名称はユニバーサルリファレンスではなく、フォワーディングリファレンスです。標準では、 cv 修飾されていないテンプレート パラメーターへの右辺値参照のみがこのカテゴリに分類されると述べています。

14.8.2.1 関数呼び出しからのテンプレート引数の推定 [temp.deduct.call]

3 P が cv 修飾された型の場合、P の型の最上位の cv 修飾子は型推定では無視されます。P が参照型の場合、P によって参照される型が型推定に使用されます。転送参照は、cv 修飾されていないテンプレート パラメーターへの右辺値参照です。P が転送参照で、引数が左辺値の場合、型推定のために A の代わりに「A への左辺値参照」型が使用されます。[ 例:

template <class T> int f(T&& heisenreference);
template <class T> int g(const T&&);
int i;
int n1 = f(i); // calls f<int&>(int&)
int n2 = f(0); // calls f<int>(int&&)
int n3 = g(i); // error: would call g<int>(const int&&), which
               // would bind an rvalue reference to an lvalue

— 終了例 ]

転送const T&&参照として動作できるようにすると、パラメーターとして右辺値参照のみを受け取るテンプレート関数をオーバーロードできなくなります。

更新: @HowardHinnant がコメントで言及しているように、const T&&その用途があります (この Q&Aも参照してください)。

于 2016-08-07T15:27:51.927 に答える