OSDN Git Service

[fix] 構造体のゼロクリアの条件
authorHabu <habu1010+github@gmail.com>
Sat, 20 Mar 2021 10:56:26 +0000 (19:56 +0900)
committerHabu <habu1010+github@gmail.com>
Sat, 20 Mar 2021 11:19:10 +0000 (20:19 +0900)
std::is_trivial_v が false かつ std::is_trivially_copyable_v
が true の型に memset してゼロクリアしようとするとgccが
警告を発するので、memsetでのクリアを行うのは std::is_trivial_v
が true の型に条件を狭める。

src/term/z-virt.h

index d126927..fd6f63a 100644 (file)
 // データクリアマクロ WIPE/C_WIPE の実装
 //
 
-// トリビアルコピーが可能な型は memset でゼロクリアする
-template <typename T, std::enable_if_t<std::is_trivially_copyable_v<T>, std::nullptr_t> = nullptr>
+// トリビアル型は memset でゼロクリアする
+template <typename T, std::enable_if_t<std::is_trivial_v<T>, std::nullptr_t> = nullptr>
 inline T *c_wipe_impl(T *p, size_t n)
 {
     return static_cast<T *>(memset(p, 0, sizeof(T) * n));
 }
-template <typename T, std::enable_if_t<std::is_trivially_copyable_v<T>, std::nullptr_t> = nullptr>
+template <typename T, std::enable_if_t<std::is_trivial_v<T>, std::nullptr_t> = nullptr>
 inline T *wipe_impl(T *p)
 {
     return static_cast<T *>(memset(p, 0, sizeof(T)));
 }
 
-// トリビアルコピーが不可能な型はデフォルトコンストラクタで生成したオブジェクトをコピーする
-template <typename T, std::enable_if_t<!std::is_trivially_copyable_v<T>, std::nullptr_t> = nullptr>
+// 非トリビアル型はデフォルトコンストラクタで生成したオブジェクトをコピーする
+template <typename T, std::enable_if_t<!std::is_trivial_v<T>, std::nullptr_t> = nullptr>
 inline T *c_wipe_impl(T *p, size_t n)
 {
     T obj{};
@@ -69,7 +69,7 @@ inline T *c_wipe_impl(T *p, size_t n)
     }
     return p;
 }
-template <typename T, std::enable_if_t<!std::is_trivially_copyable_v<T>, std::nullptr_t> = nullptr>
+template <typename T, std::enable_if_t<!std::is_trivial_v<T>, std::nullptr_t> = nullptr>
 inline T *wipe_impl(T *p)
 {
     *p = T{};