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...のいずれでもない場合、呼び出しはコア定数式ではない。
例
動的な幅指定の正しい使用
出力
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では、formatterのparse()内でcheck_dynamic_spec_integral()が呼ばれることにより、コンパイル時に型の不一致が検出されるようになった。
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- Visual C++: ??