5

次の C++11 コードはコンパイルされません。

struct T {};

void f(T&&) { }

void g(T&& t) { f(t); }

int main()
{
    g(T());
}

これを行う正しい方法は次のとおりです。

void g(T&& t) { f(move(t)); }

これを正しい自然言語用語で説明するのは非常に困難です。パラメータtは「&&」ステータスを失ったようで、std::move.

を何と呼びますT()g(T())

を何と呼びますT&&g(T&& t)

を何と呼びますtg(T&& t)

tを何と呼びますか?f(t)f(move(t))

の戻り値を何と呼びますmove(t)か?

全体的な効果を何と呼びますか?

この問題を扱っている標準のセクションはどれですか?

4

5 に答える 5

7

タイプが「右辺値参照」であっても、すべてのパラメータは左辺値です。名前が付いているので、何度でも参照できます。名前付き右辺値参照が右辺値である場合、驚くべき動作が発生します。左辺値からの暗黙の移動は必要ないため、明示的にstd::move.

于 2013-01-06T18:16:15.847 に答える
7

重要な点は、パラメーターT&& bは右辺値にのみバインドできるが、後で参照する場合、式bは左辺値であるということです。

したがって、関数への引数は右辺値でなければなりませんが、関数本体内ではパラメーターは左辺値です。それまでに参照をバインドして名前を付け、名前のない一時的なものではなくなっているからです。

式には(intなどstring) があり、値カテゴリ(左辺値または右辺値など) があり、これら 2 つのことは区別されます。

として宣言された名前付き変数は、T&& bタイプ「右辺値参照T」を持ち、右辺値にのみバインドできますが、後でその参照を使用するとb、名前があり、いくつかのオブジェクトを参照するため、式は値カテゴリ「左辺値」を持ちます (たとえそれが右辺値だったとしても、参照がバインドされているものは何でも。) これは、左辺値であるという理由bだけで言うことができない右辺値を取る別の関数に渡すことを意味します。 .f(b)bstd::move(b)

于 2013-01-06T18:19:34.407 に答える
5

g(T()) の T() を何と呼びますか?

一時的 (移動可能)。

g(T&& t) の T&& を何と呼びますか?

T&& は右辺値参照であり、移動可能なオブジェクトを表します。

g(T&& t) の t を何と呼びますか?

t は、名前で参照できるため、実際には左辺値です。

f(t) と f(move(t)) の t を何と呼びますか?

  1. 左辺値
  2. move() によって返されたときに右辺値参照に変換される左辺値

move(t) の戻り値を何と呼びますか?

r値参照

注意として; 構造体 C を呼び出して、T が実際にテンプレート化されている別の例を作成する必要があります。T は実際には である可能性があるため、関数では非常に注意せずにtemplate< typename T > void f( T&& t );単純に使用することはできないためコードは異なる必要がありますstd::move()const&std::move()std::forward< T >( t )

于 2013-01-06T18:15:36.353 に答える
4

g(T()) の T() を何と呼びますか?

これは一時オブジェクトと右辺値です。

g(T&& t) の T&& を何と呼びますか?

これを右辺値参照と呼びます。

その理由

void g(T&& t) { f(t); }

機能しないのは、右辺値参照が名前付きオブジェクトにバインドできないためです (その名前付きオブジェクトがたまたま別の右辺値参照であっても)。

于 2013-01-06T18:17:02.210 に答える
1

パラメータtはその「ステータス」を失いません。簡単に言えば、パラメーターtは右辺値参照ですが、左辺値です。左辺値性と右辺値性は直交する概念であり、値参照 (右辺値参照を含む) に関する値に適用されることに注意してください。したがって、右辺値参照は、左辺値または右辺値のいずれかになります。あなたの例のように名前がある場合、それは左辺値です。これにより、型システムが直交し、IMHOの優れた機能です。

于 2013-01-06T18:16:48.867 に答える