c++ standard_layout 用于 ref 类型

c++ standard_layout for ref types

我想了解为什么 standard_layout 不适用于 ref 类型?

#include <type_traits>

struct X {
    int y;
};

static_assert(std::is_standard_layout_v<X>);
static_assert(std::is_standard_layout_v<X&>); // does not compile

如您所见,is_standard_layout 仅适用于对象类型,不适用于引用。

因此,如果您想要类型或对类型的引用,您可以使用:

static_assert(std::is_standard_layout_v<std::remove_reference_t<X>>);

remove_reference_t 将为引用生成 referred-to 类型,如果您传递的不是引用,则生成类型本身(注意:对于较旧的编译器,您可以使用 std::remove_reference<T>::type).

因为标准布局类型由 [the standard 在 [basic.types]:

中定义
  • Scalar types
  • standard-layout class types
  • arrays of such types and
  • cv-qualified versions of these types

are collectively called standard-layout types.

构成 standard-layout class 类型的事物列表相当长(参见 [class]),但引用显然不是 class。

特别是该列表没有提及引用,因此即使是对 standard-layout 类型(如 intfloat const[16])的引用也不是 standard-layout 本身。