2

私はスコット・マイヤーズによるEffective modern C++を読んでいます

関数パラメーターであるユニバーサル参照の場合、初期化子は呼び出しサイトで提供されます。

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

Widget w;
f(w)

f(std::move(w));


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

参照が普遍的であるためには、型推論が必要ですが、それだけでは十分ではありません。参照宣言の形式も正しい必要があり、その from はかなり制約されています。正確に " " でなければなりませんT&&

f が呼び出されると、型Tが推定されます (呼び出し元が明示的に指定しない限り、私たちは気にしません)。しかし、param の型宣言の形式は " T&&" ではなく、" std::vector<T>&&" です。これにより、 param が普遍的な参照である可能性が排除されます。したがって、 param は右辺値参照であり、左辺値を渡そうとすると、コンパイラが喜んで確認します。f

std::vector<int> v;
f(v); // error! can't bind lvalue to rvalue reference.

上記では、次の質問があります

  1. 作成者が「呼び出し元が明示的に指定しない限り、私たちが関与しないエッジケース」とはどういう意味ですか? 作成者が発信者が明示的に指定していると言及しているエッジケースとは何かの例を提供するように要求します
4

1 に答える 1

1

作成者は、エンド ユーザーが への呼び出しでタイプ パラメータを明示的に指定していることに言及していますf

f<Widget>(w);
于 2015-11-23T07:10:38.633 に答える