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