名前空間
変種
操作

std::common_reference

提供: cppreference.com
< cpp‎ | types
 
 
 
型サポート
型の性質
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(C++20未満)
(C++11)(C++20で非推奨)
(C++11)
型特性定数
メタ関数
(C++17)
定数評価文脈
サポートされている操作
関係と性質の問い合わせ
型変更
(C++11)(C++11)(C++11)
型変換
(C++11)
(C++11)
(C++17)
common_reference
(C++20)
(C++11)(C++20未満)(C++17)
 
ヘッダ <type_traits> で定義
template< class... T >
struct common_reference;
(C++20以上)

T... に共通の参照型、つまり T... のすべての型が変換または束縛可能な型を調べます。 そのような型が存在すれば (後述のルールに従って決定されます)、メンバ type がその型を表します。 そうでなければ、メンバ type は存在しません。 T... のいずれかの型が void (または cv 修飾された void) 以外の不完全型である場合、動作は未定義です。

参照型が与えられたとき、 common_reference は供給された参照型をすべて束縛できる参照型を求めようとしますが、そのような参照型を見つけられない場合は非参照型を返すことがあります。

  • sizeof...(T) がゼロの場合、メンバ type は存在しません。
  • sizeof...(T) が1の場合 (すなわち T... が型 T0 を1つだけ含む場合)、メンバ typeT0 と同じ型を表します。
  • sizeof...(T) が2の場合 (すなわち T... が型 T1T2 の2つを含む場合)、
    • T1T2 がどちらも参照型であり、 (下の定義に従って) T1T2単純な共通参照型 S が存在すれば、メンバ型 typeS を表します。
    • そうでなく、 std::basic_common_reference<std::remove_cvref_t<T1>, std::remove_cvref_t<T2>, T1Q, T2Q>::type が存在すれば、メンバ型 type はその型を表します。 ただし TiQTiQ<U>Ti の cv 修飾および参照修飾を追加された U であるような単項エイリアステンプレートです。
    • そうでなく、 decltype(false? val<T1>() : val<T2>()) が有効な型であれば、メンバ型 type はその型を表します。 ただし val は関数テンプレート template<class T> T val(); です。
    • そうでなく、 std::common_type_t<T1, T2> が有効な型であれば、メンバ型 type はその型を表します。
    • そうでなければ、メンバ type は存在しません。
  • sizeof...(T) が2より大きい場合 (すなわち T... が型 T1, T2, R... から構成される場合)、 std::common_reference_t<std::common_reference_t<T1, T2>, R...> が存在すれば、メンバ type はその型を表します。 そうでなければ、メンバ type は存在しません。

T1T2単純な共通の参照型は以下のように定義されます。

  • T1cv1 X & であり T2cv2 Y & である場合 (すなわちどちらも左辺値参照型の場合)、 decltype(false? std::declval<cv12 X &>() : std::declval<cv12 Y &>()) が存在しそれが参照型であれば、単純な共通の参照型はその型です。 ただし cv12cv1cv2 の和です。
  • T1T2 がどちらも右辺値参照型の場合、 T1 &T2 & の単純な共通の参照型 (ひとつ上の項目に従って決定されます) が存在すれば、 C がその型の対応する右辺値参照型としたとき、 std::is_convertible_v<T1, C>std::is_convertible_v<T2, C> がどちらも true であれば、 T1T2 の単純な共通の参照型は C です。
  • そうでなければ、2つの型の一方が左辺値参照型 A & でなければならず、他方が右辺値参照型 B && でなければなりません (A および B は cv 修飾されていても構いません)。 DA &B const & の単純な共通の参照型を表すとき、 D が存在し、 std::is_convertible_v<B&&, D>true であれば、単純な共通の参照型は D です。
  • そうでなければ、単純な共通の参照型は存在しません。

目次

[編集] メンバ型

名前 定義
type T... のすべてに対する共通の参照型

[編集] ヘルパー型

template< class... T >
using common_reference_t = typename std::common_reference<T...>::type;
template< class T, class U, template<class> class TQual, template<class> class UQual >
struct basic_common_reference { };

クラステンプレート basic_common_reference はユーザ定義型 (一般的にはプロキシの参照) に対する common_reference の結果にユーザが影響を与えることを可能にするカスタマイゼーションポイントです。 プライマリテンプレートは空です。

[編集] 特殊化

std::is_same<T, std::decay_t<T>>std::is_same<U, std::decay_t<U>> がどちらも true であり、少なくとも一方がプログラム定義型に依存する場合、プログラムは最初の2つの引数 T および U に対して basic_common_reference<T, U, TQual, UQual> を特殊化しても構いません。

そのような特殊化が type という名前のメンバを持つ場合、それは TQual<T>UQual<U> の両方が変換可能な型を表すパブリックな曖昧でないメンバ型でなければなりません。 さらに、 std::basic_common_reference<T, U, TQual, UQual>::typestd::basic_common_reference<U, T, UQual, TQual>::type は同じ型を表さなければなりません。

プログラムは3番目および4番目の引数に対して basic_common_reference を特殊化してはならず、 common_reference 自身も特殊化してはなりません。 これらのルールに違反する特殊化を追加するプログラムは未定義動作を持ちます。

[編集] ノート

[編集]

[編集] 関連項目

指定された型のグループの共通型を調べます
(クラステンプレート) [edit]
2つの型が共通の参照型を共有することを指定します
(コンセプト) [edit]