最終更新日時(UTC):
が更新

履歴 編集

条件式での構造化束縛の使用を許可 [P0963R3](C++26)

このページはC++26に採用される見込みの言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

概要

C++26では、if文、while文、for文、switch文の条件式において構造化束縛を使用できるようになる。

C++23までは、条件分岐文の初期化式で構造化束縛は使用できたが、その場合に条件式を別途指定する必要があった。C++26では構造化束縛した全体がbool型に変換可能であれば、条件式として構造化束縛を使用できるようになった。

// C++23
if (auto [to, ec] = std::to_chars(p, last, 42); ec == std::errc{}) {
  auto s = std::string(p, to);
  
}

// C++26
// std::to_charsの戻り値型であるstd::to_chars_resultは、
// boolへの変換演算子をもつ
if (auto [to, ec] = std::to_chars(p, last, 42)) {
  auto s = std::string(p, to);
  
}

なお、条件分岐文での初期化式と、全体をbool変換する条件式は別で指定できる。

#include <print>
#include <charconv>
#include <string_view>

int f() { return 123; }

int main()
{
  char out[50]{};
  auto begin = std::begin(out);
  auto end = std::end(out);

  if (int value = f(); auto [ptr, ec] = std::to_chars(begin, end, value)) {
    std::println("{}", std::string_view(begin, ptr - begin));
  }
  else {
    std::println("conversion failed.");
  }
}

関連項目

参照