👉
指示付き初期化
構造体の初期化は、大体以下の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言語に追加されてからすぐ入れて欲しかったなぁ。
Discussion
C言語の指示付き初期化が標準化されたのは C99 なので、C++誕生時に「既にあった機能」とは言いづらいかもしれません。それはそれとしてそれから 20 年は経っているので遅いのは確かですが。
@yaito3014 さん
ありがとうございます。確かに誤解のはらむ表現になっていました。表現の見直し+メモ、を対応しました!