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

履歴 編集

function template
<format>

std::basic_format_parse_context::check_dynamic_spec(C++26)

template<class... Ts>
constexpr void check_dynamic_spec(size_t id) noexcept;

概要

動的な幅・精度の引数の型がコンパイル時に正しいか検証する。

この関数はコンパイル時の定数式としてのみ意味のある検証を行う。idに対応するフォーマット引数の型がTs...のいずれかでなければ、呼び出しがコア定数式ではなくなり、コンパイルエラーとなる。

適格要件

  • Ts...の型は一意であること
  • Ts...の各型は、bool, char_type, int, unsigned int, long long int, unsigned long long int, float, double, long double, const char_type*, basic_string_view<char_type>, const void* のいずれかであること

備考

id >= num_args_である場合、またはidに対応するフォーマット引数の型がTs...のいずれでもない場合、呼び出しはコア定数式ではない。

動的な幅指定の正しい使用

#include <format>
#include <iostream>

int main()
{
  // OK: 動的な幅に整数を指定
  std::cout << std::format("{:>{}}", "hello", 10) << std::endl;

  // OK: 引数番号を明示的に指定して動的な幅を使用
  std::cout << std::format("{0:>{1}}", "hello", 10) << std::endl;
}

出力

     hello
     hello

C++26でコンパイルエラーになる例 (C++23では実行時エラー)

#include <format>
#include <string>

int main()
{
  // C++23: 実行時エラー
  // C++26: コンパイルエラー
  // 動的な幅に文字列を渡しているが、整数型が必要
  std::string s = std::format("{:>{}}", "hello", "10");
}

C++23まではフォーマット引数の型チェックが実行時に行われるため、動的な幅に"10"(文字列)を指定した場合は実行時にformat_error例外が送出されていた。

C++26では、formatterparse()内でcheck_dynamic_spec_integral()が呼ばれることにより、コンパイル時に型の不一致が検出されるようになった。

バージョン

言語

  • C++26

処理系

参照