C++1z if文とswitch文の条件式と初期化を分離

for文が for (初期化式; 条件式; 加算式)になっているのと同様に、if文とswitch文にも、条件式の前準備としての初期化式をif (初期化式; 条件式)のように書けるようになります。

// mapへの要素挿入
if (auto p = m.try_emplace(key, value); !p.second) {
  // 要素挿入に失敗 (すでにkeyが登録されている)
}
else {
  // 挿入した要素を使用して何か処理する
  process(p.first);
}
if (status_code c = open_file(); c != SUCCESS) {
  // 処理に失敗
  // 失敗の原因ごとに処理をする
  if (c == NO_FILE) {
  }
  if (c == FORMAT_ERROR) {
  }
}
switch (Button button(args); Status s = button.status()) {
  case OK: break;
  default: throw BadStatus(toString(s));
}

構文としては、

if (condition)
if (init-statement; condition)

のように2種類用意されるのではなく、初期化式を省略可能にして、以下のように定義されます。

if (init-statement;(opt) condition)

そのため、後に紹介するif constexpr文でも初期化式は使用できます。

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。