5

私は何週間もの間、右辺値と右辺値参照を詳細に注意深く研究してきました。私は、次の違いを理解する上である程度明確になっているという自信を深めています。

  • 変数または関数パラメーターが定義される型(つまり、 int x;vs .int && x = …;
  • 以前に定義されたパラメーターを使用する可能性があるものを含む、式の式カテゴリ(つまり、関数定義A&& foo()が与えられ、 のみからなる式が与えられたfoo()場合、式カテゴリは「xvalue」です)
  • 部分式が包含式内で使用された場合の部分式の評価結果の(つまり、同じ定義が与えられた場合、包含式内で使用された場合の部分式fooは(not ) です)。foo()AA&&

私の質問は、 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&& atoはxvaluesprvaluestestの両方に正常にバインドされるため、オーバーロードの解決に関して xvalues と prvalues の実際の違いは何ですか?

式の xvalue/prvalue の性質が異なる関数オーバーロードの解決をもたらすシナリオの例はありますか? decltypeそれとも、 xvaluesと rvalues の区別は、関数オーバーロードの解決とは関係なく、言語の他の側面にのみ関係しますか?

4

1 に答える 1

3

過負荷の解決に違いがあるとは思いません。

ただし、どの式が xvalues と prvalues であるかを明確にする理由は他にもたくさんあります。Xvalue は変更可能です。prvalues ではありません。Xvalue は、オブジェクトの有効期間の前または後の glvalues の不適切な使用に対する規則の対象となります。これは、prvalues の問題ではありません。

于 2012-12-22T04:56:40.503 に答える