最終更新日時(UTC):
が更新

履歴 編集

concept
<concepts>

std::same_as(C++20)

namespace std {
  template <class T, class U>
  concept same_as = /*see below*/;
}

概要

same_asは、型T, Uが同じ型であることを表すコンセプトである。これを満たす型のペアはCVや参照修飾も含めて完全に同じ型である必要がある。

要件

まず、説明専用コンセプトsame-as-implを以下のように定義する。

template <class T, class U>
concept same-as-impl = is_same_v<T, U>;

same_asコンセプトは、以下のように定義される。

template <class T, class U>
concept same_as = same-as-impl<T, U> && same-as-impl<U, T>;

備考

same_as<T, U>same_as<U, T>を包摂しており、その逆も同様である。定義にsame-as-implを使用しているのは、この包摂関係を成立させるため。

#include <iostream>
#include <concepts>
#include <cstdint>

int main()
{
  std::cout << std::boolalpha;

  std::cout << std::same_as<int, int> << std::endl;
  std::cout << std::same_as<int, short> << std::endl;
  std::cout << std::same_as<int, const int> << std::endl;
  std::cout << std::same_as<int, int&> << std::endl;
  std::cout << std::same_as<int, std::int32_t> << std::endl;
  std::cout << std::same_as<std::int32_t, int> << std::endl;
}

出力例(GCC10.1 x86-64)

true
false
false
false
true
true

std::int32_tint型は処理系によっては同じ型ではない場合がありうる。また、処理系によってはstd::int32_tは定義されないかもしれない。

バージョン

言語

  • C++20

処理系

関連項目

参照