Skip to content

Latest commit

 

History

History
51 lines (37 loc) · 1.79 KB

user-generated_static_assert_messages.md

File metadata and controls

51 lines (37 loc) · 1.79 KB

static_assertの診断メッセージにユーザーが生成した文字列の指定を許可

  • 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

関連項目

参照