最終更新日時: 2026年06月01日 03時17分56秒 (JST)
Tetsuro Matsumura が更新

履歴 編集

function
<format>

# std::basic_format_arg::コンストラクタ(C++20)

    namespace std {
      template<class Context>
      class basic_format_arg {
      private:
        using char_type = typename Context::char_type;                              // exposition only

        variant<monostate, 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*, handle> value;                                         // exposition only

        template<class T>
        explicit
        basic_format_arg(T& v) noexcept;  // (2) C++20 exposition only
        template<class T>
        constexpr explicit
        basic_format_arg(T& v) noexcept;  // (2) C++26 exposition only

      public:
        basic_format_arg() noexcept;           // (1) C++20
        constexpr basic_format_arg() noexcept; // (1) C++26
      };
    }

## 概要

- (1): 空の`basic_format_arg`を構築する
- (2): (説明専用)`make_format_args`の内部で使用され、引数から`basic_format_args`を構築する。

## テンプレートパラメーター制約

- (2):
  - (C++20) `T`はフォーマットできる型であること
  - (C++23) `T`は `formattable-with<Context>`を満たすこと

## 事前条件

- (2): もし `decay_t<T>` が `char_type*` または `const char_type*` である場合、 `static_cast<const char_type*>(v)` はヌル終端された `char_type` の配列を指すこと。

## 事後条件

- (1): `!(*this)`

## 例外

投げない。

## 効果

- (1): `value`を`monostate`で初期化する。

- (2): `TD`を`remove_const<T>`として、以下の順に`value`を初期化する。

  - `TD`が`bool`なら、`v`で初期化
  - `TD`が`char`かつ`char_type`が`wchar_t`なら、`value`を`static_cast<wchar_t>(v)`で初期化
  - `TD`が`char`かつ`char_type`が`wchar_t`なら、`value`を`static_cast<wchar_t>(static_cast<unsigned char>(v))`で初期化
  - `TD`が符号つき整数型かつ`sizeof(TD) <= sizeof(int)`なら、`value`を`static_cast<int>(v)`で初期化
  - `TD`が符号なし整数型かつ`sizeof(TD) <= sizeof(unsigned int)`なら、`value`を`static_cast<unsigned int>(v)`で初期化
  - `TD`が符号つき整数型かつ`sizeof(TD) <= sizeof(long long int)`なら、`value`を`static_cast<long long int>(v)`で初期化
  - `TD`が符号なし整数型かつ`sizeof(TD) <= sizeof(unsigned long long int)`なら、`value`を`static_cast<unsigned long long int>(v)`で初期化
  - `TD`が浮動小数点数なら、`v`で初期化
  - `TD`が`basic_string_view`または`basic_string`の特殊化で、`TD::value_type`が`char_type`と等しければ、`value`を`basic_string_view<char_type>(v.data(), v.size())`で初期化
  - `decay_t<T>`が`char_type*`または `const char_type*` なら、`value`を`static_cast<const char_type*>(v)`で初期化
  - `is_void_v<remove_pointer_t<TD>>`が`true`、または`is_null_pointer_v<TD>`が`true`なら、`value`を`static_cast<const void*>(v)`で初期化
  - それ以外なら、`value`を`handle(v)`で初期化

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??

## 参照

- P0645R10 Text Formatting
- P3391R2 `constexpr std::format`
  - C++26から`constexpr`に対応した