私は何週間もの間、右辺値と右辺値参照を詳細に注意深く研究してきました。私は、次の違いを理解する上である程度明確になっているという自信を深めています。
- 変数または関数パラメーターが定義される型(つまり、
int x;
vs .int && x = …;
- 以前に定義されたパラメーターを使用する可能性があるものを含む、式の式カテゴリ(つまり、関数定義
A&& foo()
が与えられ、 のみからなる式が与えられたfoo()
場合、式カテゴリは「xvalue」です) - 部分式が包含式内で使用された場合の部分式の評価結果の型(つまり、同じ定義が与えられた場合、包含式内で使用された場合の部分式
foo
の型は(not ) です)。foo()
A
A&&
私の質問は、 xvalue式とprvalue式の違いに関するものです (これらの式のカテゴリはどちらも右辺値です)。
与えられた:
class A
{};
A&& foo() {…}
A goo() {…}
void test(A&& a) {…}
int main()
{
test(foo()); // test() called with xvalue expression
test(goo()); // test() called with prvalue expression
}
関数test()
は xvalue 式と prvalue 式の両方で正常に呼び出されることに注意してください。(これについて誤解がある場合は、訂正してください。)
私の質問は次のとおりです。関数パラメーターA&& a
toはxvaluesとprvaluestest
の両方に正常にバインドされるため、オーバーロードの解決に関して xvalues と prvalues の実際の違いは何ですか?
式の xvalue/prvalue の性質が異なる関数オーバーロードの解決をもたらすシナリオの例はありますか? decltype
それとも、 xvaluesと rvalues の区別は、関数オーバーロードの解決とは関係なく、言語の他の側面にのみ関係しますか?