引用类型的c++标准布局



我试图理解为什么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将为引用生成被引用的类型,或者如果传递的不是引用,则生成类型本身(注意:对于较旧的编译器,可以使用std::remove_reference<T>::type(。

因为标准布局类型是由〔basic.types〕中的标准定义的:

  • 标量类型
  • 标准布局类类型
  • 此类类型的阵列,以及
  • 这些类型的cv合格版本

统称为标准布局类型。

构成标准布局类类型的事物列表相当长(参见[class](,但引用显然不是类。

特别是,该列表没有说明引用,因此即使是对标准布局类型(如intfloat const[16](的引用本身也不是标准布局。

最新更新