1. ホーム
  2. c++

[解決済み] C++11の "return {}"文は何を意味しますか?

2022-10-03 17:26:01

質問

この文は何を意味しているのでしょうか?

return {};

をC++11で表示する場合、どのような場合に(例えば)ではなく

return NULL;

または

return nullptr;

どのように解決するのですか?

return {}; は、関数の戻り値の型を空で初期化したオブジェクトを返すことを示します。 リスト初期化子 となります。正確な動作は、返されるオブジェクトの型に依存します。

から cppreference.com (OP には C++11 のタグが付けられているため、C++14 と C++17 でのルールは除外しました。詳細はリンクを参照してください)。

  • braced-init-list が空で、T がデフォルト コンストラクタを持つクラス型の場合、値初期化が実行されます。
  • それ以外の場合、Tが集約型の場合、集約初期化が実行されます。
  • それ以外の場合、Tがstd::initializer_listの特殊化であれば、Tオブジェクトはコンテキストに応じて、braid-init-listから直接初期化またはコピー初期化されます。
  • そうでなければ、Tのコンストラクタは、2つのフェーズで、考慮されます。

    • std::initializer_list を唯一の引数として、または残りの引数がデフォルト値を持つ場合は最初の引数として取るすべてのコンストラクタが調べられ、std::initializer_list 型の単一の引数に対してオーバーロード解決により一致させられます。
    • 前のステージでマッチングが行われなかった場合、T のすべてのコンストラクターは braced-init-list の要素からなる引数のセットに対してオーバーロード解決に参加し、非狭義変換のみが許可されるという制限を受けます。この段階でコピー リスト初期化に対する最適なマッチとして明示的なコンストラクターが生成された場合、コンパイルは失敗します(単純なコピー初期化では、明示的なコンストラクターはまったく考慮されないことに注意してください)。
  • それ以外の場合(Tがクラス型でない場合)、braid-init-listに要素が1つしかなく、Tが参照型でないか、要素の型と互換性のある参照型であれば、狭義の変換が許されないことを除いて、Tは(direct-list-initializationで)直接初期化、または(copy-list-initializationで)複写初期化されます。

  • そうでなければ、Tが要素の型と互換性のない参照型である場合。(これは、参照がconstでないlvalueの参照である場合、失敗します)
  • その他、braced-init-listに要素がない場合、Tは値初期化されます。

C++11 より前のバージョンでは、関数が std::string を返す関数に対して、あなたはこう書いたことでしょう。

std::string get_string() {
    return std::string();
}

C++11のブレース構文を使うと、型を繰り返す必要がありません。

std::string get_string() {
    return {}; // an empty string is returned
}

return NULL そして return nullptr は、関数がポインタ型を返す場合に使用されるべきです。

any_type* get_pointer() {
    return nullptr;
}

しかし NULL は整数値(0)のエイリアスに過ぎないため、C++11 からは非推奨とされています。 nullptr は実際のポインタ型であるためです。

int get_int() {
    return NULL; // will compile, NULL is an integer
}

int get_int() {
    return nullptr; // error: nullptr is not an integer
}