如何创建 `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);

Demo.