👉

指示付き初期化

2024/11/09に公開
2

構造体の初期化は、大体以下の2つのパターンになると思います。

以下の構造体があるとしましょう。

struct Point
{
    double x;
    double y;
    double z;
};

作成時に直接渡すパターン

Point point{10.0, 20.0, 30.0};

一行でできるため、一番使いやすいですが、同じ型の引数が複数存在する場合は、順番に注意しないといけないです。順番を間違えたとしてもコンパイルエラーにならないです。

作成後に指定するパターン

Point point{};
point.x = 10.0;
point.y = 20.0;
point.z = 30.0;

この書き方の方が分かりやすいですが、1つずつ別々で指定しないといけないというデメリットがあります。

C++20 の指示付き初期化

でも C++20 からようやく C 言語でおなじみの指示付き初期化が追加されました。

Point point { .x = 10.0, .y = 20.0, .z = 30.0 };

指定の順番は定義の順番に合わせないとコンパイラーによって警告になりますが、違う順番でも一応正しく初期化されます。

Point point { .y = 20.0, .x = 10.0, .z = 30.0 };

warning: ISO C++ requires field designators to be specified in declaration order; field 'y' will be initialized after field 'x' [-Wreorder-init-list]

以下のようにすべてのメンバー変数に値を指定しない場合は、デフォルト値で初期化されるだけでコンパイルエラーにはならないです。

Point point { .x = 10.0, .z = 30.0 }; // y は 0 で初期化される

これで構造体の初期化が使いやすくて分かりやすくなります。残念ながら、クラスの場合はまだできないです。

C 言語に昔からある機能が C++ が作られてから 35 年後に追加されるっておかしいですよね。C言語に追加されてからすぐ入れて欲しかったなぁ。


|cpp記事一覧へのリンク|

Discussion

yaito3014yaito3014

C 言語に既にあった機能が

C言語の指示付き初期化が標準化されたのは C99 なので、C++誕生時に「既にあった機能」とは言いづらいかもしれません。それはそれとしてそれから 20 年は経っているので遅いのは確かですが。

スペース・ソルバ株式会社スペース・ソルバ株式会社

@yaito3014 さん

C言語の指示付き初期化が標準化されたのは C99 なので、C++誕生時に「既にあった機能」とは言いづらいかもしれません

ありがとうございます。確かに誤解のはらむ表現になっていました。表現の見直し+メモ、を対応しました!