namespace std {
template<class S, class M>
constexpr bool is_pointer_interconvertible_with_class(M S::*m) noexcept;
}
概要
メンバポインタm
がクラスS
のポインタの間でポインタ相互交換可能かを判定する。
適格要件
S
は完全型であること。
戻り値
S
はスタンダードレイアウト型、M
はオブジェクト型であり、m
はヌルポインタではなく、型S
のオブジェクトs
がサブオブジェクトs.*m
とポインタ相互交換可能であるときに限ってtrue
を返す。それ以外の場合はfalse
を返す。
例外
投げない
例
#include <type_traits>
struct A { int a; };
struct B { int b; };
struct C: A, B {};
int main()
{
static_assert( std::is_pointer_interconvertible_with_class<A>( &A::a ));
static_assert( std::is_pointer_interconvertible_with_class<B>( &B::b ));
// 見た目に反して &C::b は int(B::*) 型を持つためS=Bに型推論されてしまう。
static_assert( std::is_pointer_interconvertible_with_class( &C::b ));
// テンプレートパラメータS=Cを明示することで M(C::*) の検査となる。
// このケースではCはスタンダードレイアウトクラスではなくfalseとなる。
static_assert(!std::is_pointer_interconvertible_with_class<C>( &C::b ));
}
出力
バージョン
言語
- C++20
処理系
- Clang: ??
- GCC: ??
- Visual C++: ??