最終更新日時: 2023年11月28日 21時47分39秒 (JST)
suomesta が更新

履歴 編集

function template
<type_traits>

# std::is_pointer_interconvertible_with_class(C++20)

    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++: ??

## 関連項目

- `is_pointer_interconvertible_base_of`

## 参照

- P0466R5 Layout-compatibility and Pointer-interconvertibility Traits