- 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]
true
false
false
false
true
true
std::int32_t
とint
型は処理系によっては同じ型ではない場合がありうる。また、処理系によってはstd::int32_t
は定義されないかもしれない。
- C++20
- Clang: ??
- GCC: 10.1 [mark verified]
- Visual C++: 2019 Update 3 [mark verified]