覚書。

 

1. memsetはint以外でも使える?
ゼロ初期化目的であればOKな型:
    int, float, double, bool, char, short, long, unsigned 系
    いわゆる「POD(Plain Old Data)」型ならOK ❌ NGや危険:
    ポインタ(アーキテクチャ依存でNULLポインタが非0バイトになる場合あり)
    オブジェクト型(コンストラクタ・デストラクタを持つ)
memsetでゼロ埋めしたいなら、「すべてのビットが0で意味がある」型だけにするのが安全。

 

2. std::is_same で memset分岐する方法?
if constexpr (std::is_same<T, int>::value || std::is_same<T, double>::value || ...) {
    std::memset(...);  // OK
} else {
    // 何もしない or static_assert でコンパイルエラー
}

 

テンプレート制約ならこう:
static_assert(
    std::is_same<T, int>::value || std::is_same<T, float>::value || ...,
    "T must be a POD type suitable for memset");

3. コンパイルエラーを強制する方法
static_assert(std::is_same<T, int>::value || std::is_same<T, double>::value,
              "This array class supports only primitive types");
これでオブジェクト型や構造体を使うと即ビルドエラーにできます。

 

4. memsetゼロ初期化OKなプリミティブ型一覧
    int, unsigned int
    short, unsigned short
    long, unsigned long
    long long, unsigned long long
    float, double, long double
    bool
    char, unsigned char, wchar_t, char16_t, char32_t
    std::byte(C++17~)  共通点:全ビットが 0 のとき「意味を持つ」型

 

引用 ChatGPT