7

私は現在、学位論文を書いています。C++ 11の背後にある理論の説明も含まれています。これは、C ++が私の選択したプログラミング言語であり、標準が多かれ少なかれ無料で利用できるため(N3337)、迷子になるためです。の。

それでも、新しいxvalueカテゴリを正確かつ詳細に説明しようとしているときに、壁にぶつかりました。一時オブジェクトは常にxvalueであると理解していますが、標準ではこれへの参照を見つけることができません。非参照戻り型を持つ関数への関数呼び出しの式の値カテゴリはxvalueであると私は理解しています。標準では、「xvalueは、右辺値参照を含む特定の種類の式の結果である」と言われていますが、これは私を悩ませています。例えば:

TestClass { ... };
testClass createObject() { return testClass(); }

void someFunction(TestClass& testClass) { ... }
void someFunction(TestClass&& testClass) { ... }

someFunction(createObject());

上記は、予想通り、パラメータとして右辺値参照をとるオーバーロードされた関数を呼び出します。ただし、createObject()は右辺値参照を返さず、TestClass型の一時オブジェクトを返します。私の問題は今、その背後にある理由を説明しなければならないということです。式「createObject()」は何を評価しますか?一時オブジェクトを返すために実際にxvalueである場合、その背後にある理由は明確であり、過負荷の解決中に右辺値参照が優先されます。そうでない場合、標準に関するこの動作の説明は何ですか?まだ見つけていない暗黙の変換ロジックがどこかに定義されていますか?

何日も掘り下げて読んだ後でも、私はまだしっかりした説明を思い付いていないので、誰かがこれについて私を助けてくれたら本当にありがたいです。よろしくお願いします。

4

1 に答える 1

12

オブジェクトが{l|r|x}値になることはありません。値のカテゴリは式を記述します。

xvalueは、関数呼び出し式の値カテゴリであり、関数の戻り型はオブジェクトへの右辺値参照(eg std::move)であり、キャストがオブジェクトへの右辺値参照(gutsなど)であるキャスト式の値カテゴリでもあります。のstd::move)。

この例の関数呼び出し式は、非参照の戻り型を持つ関数への関数呼び出しであるためcreateObject()prvalue式です。

于 2012-03-12T16:32:15.503 に答える