我试图理解为什么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](,但引用显然不是类。
特别是,该列表没有说明引用,因此即使是对标准布局类型(如int
或float const[16]
(的引用本身也不是标准布局。