命名空间
变体
操作

std::is_pointer_interconvertible_with_class

来自 cppreference.com
< cpp‎ | types
 
 
元编程库
类型特征
类型类别
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
类型属性
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(until C++20*)
(C++11)(deprecated in C++20)
(C++11)
类型特征常量
元函数
(C++17)
支持的操作
关系和属性查询
类型修改
(C++11)(C++11)(C++11)
类型转换
(C++11)(deprecated in C++23)
(C++11)(deprecated in C++23)
(C++11)
(C++11)
(C++17)

(C++11)(until C++20*)(C++17)
编译时有理数运算
编译时整数序列
 
定义在头文件 <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() { }

[编辑] 另请参见

检查一个类型是否为一个 标准布局 类型
(类模板) [编辑]
检查一个类型是否为指向非静态成员对象的指针
(类模板) [编辑]