std::is_pointer_interconvertible_with_class
来自 cppreference.cn
定义于头文件 <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 {}; // not standard-layout 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) |
检查类型是否为非静态成员对象指针 (类模板) |