- cpp26[meta cpp]
C++26では、static_assert
に指定する表明失敗時の診断メッセージとして、文字列リテラルだけでなくユーザー定義型の文字列オブジェクトも指定できるようになる。
例えば、将来的にstd::format()
関数がconstexpr
対応した場合、それによって作られたstd::string
オブジェクトを診断メッセージとして使用できる。
#include <cstdint>
#include <format>
template <class T>
void f()
{
static_assert(
sizeof(T) == 4,
std::format("type T size should 4, actual:{}", sizeof(T))
);
}
int main()
{
f<std::int32_t>(); // OK
f<std::int64_t>(); // Error! "type T size should 4, actual:8"
}
static_assert
の構文において、
static_assert(定数式, 診断メッセージ);
診断メッセージが文字列リテラルでない場合、そのオブジェクトMは、以下の要件を満たすこと:
M.size()
からstd::size_t
への暗黙変換が定数式であることM.data()
から「const char
へのポインタ」への暗黙変換が定数式であること- メッセージのシーケンスに含まれる各文字が、エンコーディング指定されていない文字コード (ordinary literal encoding) であること
u8"message"
はNG"message"
はOK