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 类型(如 int
或 float const[16]
)的引用也不是 standard-layout 本身。
我想了解为什么 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 类型(如 int
或 float const[16]
)的引用也不是 standard-layout 本身。