私はスコット・マイヤーズによる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.
上記では、次の質問があります
- 作成者が「呼び出し元が明示的に指定しない限り、私たちが関与しないエッジケース」とはどういう意味ですか? 作成者が発信者が明示的に指定していると言及しているエッジケースとは何かの例を提供するように要求します