Skip to content

Latest commit

 

History

History
100 lines (78 loc) · 3.54 KB

common_reference_with.md

File metadata and controls

100 lines (78 loc) · 3.54 KB

common_reference_with

  • concepts[meta header]
  • concept[meta id-type]
  • std[meta namespace]
  • cpp20[meta cpp]
namespace std {
  template<class T, class U>
  concept common_reference_with =
    same_as<common_reference_t<T, U>, common_reference_t<U, T>> &&
    convertible_to<T, common_reference_t<T, U>> &&
    convertible_to<U, common_reference_t<T, U>>;
}
  • same_as[link /reference/concepts/same_as.md]
  • convertible_to[link /reference/concepts/convertible_to.md]
  • common_reference_t[link /reference/type_traits/common_reference.md]

概要

common_reference_withは、T, Uの間で、どちらの型からも変換可能な共通の参照型が存在することを表すコンセプトである。

2つの型T, Uは以下の全ての条件を満たす場合にのみ、共通の参照型を持つ。

このような型Cは、必ずしもTUと同じ型である必要はなく、参照型でなくても良い。

モデル

C = common_reference_t<T, U>等しさを保持decltype((t1))decltype((t2))が共にTとなるような式t1, t2及び、等しさを保持しdecltype((u1))decltype((u2))が共にUとなるような式u1, u2について以下の条件を満たす場合に限って、型T, Ucommon_reference_withのモデルである。

  • t1t2が等値である場合にのみ、C(t1)C(t2)も等値となる
  • u1u2が等値である場合にのみ、C(u1)C(u2)も等値となる

備考

このコンセプトをカスタマイズするには、basic_common_referenceを利用する。

#include <iostream>
#include <concepts>
#include <vector>
#include <string>

template<typename T, typename U>
requires std::common_reference_with<T, U>
void f() {
  std::cout << "T, U share a common reference type" << std::endl;
}

template<typename T, typename U>
void f() {
  std::cout << "T, U not share a common reference type" << std::endl;
}

int main()
{
  f<std::size_t&, int&>();
  f<std::string&, std::string_view&>();
  f<std::vector<int>, std::vector<int>&>();
  f<std::vector<int>, std::vector<double>>();
  f<std::pair<int&, double&>, std::pair<int, double>>();
}
  • std::common_reference_with[color ff0000]

出力

T, U share a common reference type
T, U share a common reference type
T, U share a common reference type
T, U not share a common reference type
T, U share a common reference type

バージョン

言語

  • C++20

処理系

関連項目

参照