std:: is_pointer_interconvertible_with_class
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
定義先ヘッダ
<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() { }
関連項目
|
(C++11)
|
型が
standard-layout
型かどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型が非静的メンバオブジェクトポインタかどうかをチェックする
(クラステンプレート) |