如何创建 `std::is_empty_v<T> && sizeof(T) > 1` 为真的类型 T?
How to make a type T that `std::is_empty_v<T> && sizeof(T) > 1` is true?
我在 here 遇到了一个有趣的测验问题:
Write a translation unit containing a class type T, such that
std::is_empty_v<T>
is true, and yet sizeof(T)
is greater than 1.
想了很久,没有解决办法
如何使 T
类型 std::is_empty_v<T> && sizeof(T) > 1
为真?
std::is_empty
检查是否没有成员。您可以使用对齐强制大小大于 1:
struct alignas(2) T {};
static_assert(std::is_empty_v<T>);
static_assert(sizeof(T) > 1);
由于两个相同的空classes不能共享同一个地址,我们可以创建一个class继承一个空基,也有一个空基作为成员来禁止EBO,使其尺寸大于 1
.
#include<type_traits>
struct B { };
struct D : B { [[no_unique_address]] B b; };
static_assert(std::is_empty_v<D> && sizeof(D) > 1);
我在 here 遇到了一个有趣的测验问题:
Write a translation unit containing a class type T, such that
std::is_empty_v<T>
is true, and yetsizeof(T)
is greater than 1.
想了很久,没有解决办法
如何使 T
类型 std::is_empty_v<T> && sizeof(T) > 1
为真?
std::is_empty
检查是否没有成员。您可以使用对齐强制大小大于 1:
struct alignas(2) T {};
static_assert(std::is_empty_v<T>);
static_assert(sizeof(T) > 1);
由于两个相同的空classes不能共享同一个地址,我们可以创建一个class继承一个空基,也有一个空基作为成员来禁止EBO,使其尺寸大于 1
.
#include<type_traits>
struct B { };
struct D : B { [[no_unique_address]] B b; };
static_assert(std::is_empty_v<D> && sizeof(D) > 1);