std::is_pointer_interconvertible_with_class

来自cppreference.com
< cpp‎ | types
 
 
元编程库
类型特征
类型类别
(C++11)
(C++11)(DR*)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11) 
类型属性
(C++11)
(C++11)
(C++14)
(C++11)(C++26 弃用)
(C++11)(C++20 前*)
(C++11)(C++20 弃用)
(C++11)
类型特征常量
元函数
(C++17)
受支持操作
关系与属性查询
类型修改
类型变换
(C++11)(C++23 弃用)
(C++11)(C++23 弃用)
(C++11)
(C++11)(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,其中 sS 类型的对象。

注解

成员指针表达式 &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_interconvertible201907L(C++20)指针可互换性特征:
  • std::is_pointer_interconvertible_base_of
  • std::is_pointer_interconvertible_with_class

示例

#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() { }

参阅

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