如何构造std::is_empty_v<T>为真且sizeof(T)大于1的C++类类型T?
构造满足
std::is_empty_v<T> && sizeof(T) > 1的C++类型方案 核心原理
std::is_empty_v<T>的判定仅和类的成员、继承结构特征相关,和类型的对齐要求、内存占用大小无直接关联:只要类没有非静态数据成员(0长度位域除外)、没有虚函数/虚基类、所有基类和成员类也都符合空类要求,std::is_empty_v<T>就会返回true。我们只需要在满足空类判定规则的前提下,让类的大小大于1即可。
方案1:通过对齐修饰符实现(兼容性最好)
直接给空类添加对齐约束,强制其大小满足对齐要求即可:
#include <type_traits> // 对齐要求为2的空类 struct alignas(2) T {}; // 验证条件成立 static_assert(std::is_empty_v<T>); static_assert(sizeof(T) > 1);
该方案在所有符合C++11及以上标准的编译器上都能正常工作,alignas(2)要求T的地址必须是2的整数倍,因此sizeof(T)固定为2,完全满足要求。
方案2:通过多重空基类实现
利用C++要求"不同类型的子对象必须拥有不同地址"的规则,让空类继承多个不同的空基类:
#include <type_traits> struct Base1 {}; struct Base2 {}; // 继承两个不同空基类的派生类 struct T : Base1, Base2 {}; // 验证条件成立 static_assert(std::is_empty_v<T>); static_assert(sizeof(T) > 1);
由于Base1和Base2是不同类型,它们在T中的子对象必须有不同的地址,因此T的大小至少为2,同时T本身没有任何非静态成员、也没有虚结构,仍然满足空类的判定规则。
内容的提问来源于stack exchange,提问作者xmllmx
相关产品推荐
相关产品推荐

