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_t
とint
型は処理系によっては同じ型ではない場合がありうる。また、処理系によってはstd::int32_t
は定義されないかもしれない。
バージョン
言語
- C++20
処理系
- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 3 ✅