[解決済み] 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
}
関連
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件