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
的位模式全部为零。
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__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) |
检查一个类型是否为指向非静态成员对象的指针 (类模板) |