2

以下の関数 foo() の戻りで移動コンストラクター呼び出しをサポートする C++11 標準の句はどれですか?

#include <iostream>

class A
{
    public:
    A() { std::cout << "Ctor\n"; }
    A(const A&) {std::cout << "Copy ctor\n";}
    A(A&&) {std::cout << "Move ctor\n";}
};

A foo(A&& ra) { return std::move(ra); }

int main()
{
    A a = foo(A());
}

この質問は昨日終了したと思いますが、現在は「保留」にされており、終了の理由は、あまりにもローカライズされているためです。C++11 標準に関する特定の質問をする SO の投稿が「ローカライズされすぎている」と見なされる可能性があることを理解するのは困難です。私にとって、これは用語の矛盾です。標準は、言語について疑問がある場合にすべての C++ プログラマーが探すべき「事実上の」最終文書であるためです。

4

1 に答える 1

3

コードに関する多くの節があります。具体的には、初期化 (8 節の後ろ)、オーバーロードの解決 (13 節)、さらに基本的には 3 節と 5 節で、式と参照型の値のカテゴリを理解します。

最初の式A()は、テンポラリのデフォルトの構築から生じるクラスの prvalue です。

ra直接参照バインディングによって右辺値参照を初期化します。

ramove直接参照バインディングによってのパラメーターを初期化し、 の戻り値を初期化する直接参照バインディングによって再度初期化されたmoveタイプ の xvalue を返します。一時的。Afoofoo

foo(A())は、2 番目のテンポラリを参照するクラスの prvalue です。

これは通常a、prvalue をムーブ コンストラクターに解決するオーバーロードによってコピー初期化さaれ、戻り値foo- からムーブ構築されますが、12.8/32p3 が原因です。

参照 (12.2) にバインドされていない一時クラス オブジェクトが同じ cv 非修飾型のクラス オブジェクトにコピー/移動される場合、一時オブジェクトをターゲットに直接構築することにより、コピー/移動操作を省略できます。省略されたコピー/移動の

したがって、通常、 の戻り値はfooのストレージに直接構築され、aこの 2 番目のムーブ構築は省略されます。

于 2013-06-25T12:21:39.247 に答える