Skip to content

Latest commit

 

History

History
92 lines (69 loc) · 2.51 KB

same_as.md

File metadata and controls

92 lines (69 loc) · 2.51 KB

same_as

  • concepts[meta header]
  • concept[meta id-type]
  • std[meta namespace]
  • cpp20[meta cpp]
namespace std {
  template <class T, class U>
  concept same_as = /*see below*/;
}
  • see below[italic]

概要

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

要件

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

template <class T, class U>
concept same-as-impl = is_same_v<T, U>;
  • is_same_v[link /reference/type_traits/is_same.md]

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;
}
  • std::same_as[color ff0000]

出力例(GCC10.1 x86-64)

true
false
false
false
true
true

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

バージョン

言語

  • C++20

処理系

関連項目

参照