std::is_pointer_interconvertible_with_class
来自cppreference.com
在标头 <type_traits> 定义 | ||
template< class S, class M > constexpr bool is_pointer_interconvertible_with_class( M S::* mp ) noexcept; | (C++20 起) | |
给定 S
类型的对象 s
,确定 s.*mp 是否指代 s
的子对象且 s
与其子对象 s.*mp 指针可互转换。若 S
不是完整类型则程序非良构。
若 S
不是标准布局类型 (StandardLayoutType) ,或 M
不是对象类型,或 mp
等于 nullptr,则结果始终为 false。
参数
mp | - | 要检测的成员指针 |
返回值
若 s.*mp 指代 s
的子对象且 s
与其子对象 s.*mp 指针可互转换则为 true,否则为 false,其中 s
是 S
类型的对象。
注解
成员指针表达式 &S::m 的类型并非始终是 M S::*,其中 m
的类型为 M
,因为 m
可能是从 S
的基类继承的成员。可以指定第一模板实参以避免潜在地令人诧异的结果。
若存在 M S::* 类型的值 mp
使得 std::is_pointer_interconvertible_with_class(mp) == true,则 reinterpret_cast<M&>(s) 拥有良定义结果且与 s.*mp 指代同一子对象,其中 s
是合法的 S
类型的左值。
在常用平台上,若 std::is_pointer_interconvertible_with_class(mp) == true,则 mp
的位模式为全零。
功能特性测试宏 | 值 | 标准 | 功能特性 |
---|---|---|---|
__cpp_lib_is_pointer_interconvertible | 201907L | (C++20) | 指针可互换性特征:
|
示例
运行此代码
#include <type_traits> struct Foo { int x; }; struct Bar { int y; }; struct Baz : Foo, Bar {}; // 非标准布局 static_assert( not std::is_same_v<decltype(&Baz::x), int Baz::*> ); static_assert( std::is_pointer_interconvertible_with_class(&Baz::x) ); static_assert( not std::is_pointer_interconvertible_with_class<Baz, int>(&Baz::x) ); int main() { }
参阅
(C++11) | 检查类型是否为标准布局类型 (类模板) |
(C++11) | 检查类型是否为指向非静态成员对象的指针 (类模板) |