9

これが私が思いついた状況です:

#include <iostream>
using namespace std;

struct test {
    test() { cout << "ctor" << endl; }

    test(const test&) = delete;
    test(test&&)      = delete;
};

auto f() -> test {
    return {};
    // return test{};
}

auto main() -> int {
    f();
}

このコードは clang と gcc の両方でコンパイルされますが、変更return {}するreturn test{}とコンパイルされなくなります。何故ですか?どちらの場合も同じように機能するべきではありませんか?率直に言って、これに適したユースケースがあるかどうかはわかりませんが、驚いたので、今は何が起こっているのだろうと思っています.

4

2 に答える 2

17

return {}デフォルトのコンストラクターを使用して、空の初期化子リストを使用して戻り値を初期化します。

return test{}デフォルトのコンストラクターを使用して一時を作成し、それを使用して、移動またはコピー コンストラクターを使用して戻り値を初期化します。これらのコンストラクターを削除したため、それはできません。

実際には、両方が同じ効果を持つようにコピーまたは移動は省略されますが、実際には使用されていない場合でも、2 番目のコンストラクターにはアクセス可能なコンストラクターが必要です。

于 2013-11-06T23:41:49.300 に答える