Namespaces
Variants

std:: is_pointer_interconvertible_with_class

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
定義先ヘッダ <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 - 検出するメンバーへのポインター

戻り値

true が返される条件は、 s. * mp s のサブオブジェクトを参照しており、かつ s がそのサブオブジェクト s. * mp とポインタ相互変換可能である場合である。それ以外の場合は 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 の有効な左辺値です。

一般的なプラットフォームでは、 mp のビットパターンは、 std :: is_pointer_interconvertible_with_class ( mp ) == true の場合、すべてゼロとなります。

機能テスト マクロ 標準 機能
__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() { }

関連項目

型が standard-layout 型かどうかをチェックする
(クラステンプレート)
型が非静的メンバオブジェクトポインタかどうかをチェックする
(クラステンプレート)