Namespaces
Variants

std:: common_reference

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

common_reference
(C++20)
(C++11)
(C++17)
Compile-time rational arithmetic
Compile-time integer sequences
ヘッダーで定義 <type_traits>
template < class ... T >
struct common_reference ;
(C++20以降)

T... で指定される型の共通参照型、すなわち T... 内のすべての型が変換またはバインド可能な型を決定します。そのような型が存在する場合(以下のルールに従って決定)、メンバ type はその型を示します。それ以外の場合、メンバ type は存在しません。 T... 内のいずれかの型が(possibly cv-qualified) void 以外の不完全型である場合、動作は未定義です。

参照型が与えられた場合、 common_reference は、提供された参照型すべてが束縛可能な参照型を見つけようと試みますが、そのような参照型が見つからない場合は非参照型を返す可能性があります。

  • sizeof... ( T ) がゼロの場合、メンバ type は存在しない。
  • sizeof... ( T ) が1の場合(すなわち T... が単一の型 T0 のみを含む場合)、メンバ type T0 と同じ型を示す。
  • sizeof... ( T ) が2の場合(すなわち T... が2つの型 T1 T2 を含む場合):
    • S T1 T2 単純共通参照型 (下記で定義)とする。以下の条件が全て満たされる場合、メンバ型 type S を示す:
      • T1 T2 が両方とも参照型である
      • S が適正に形成される
(C++23以降)
  • それ以外の場合、 std :: basic_common_reference < std:: remove_cvref_t < T1 > , std:: remove_cvref_t < T2 > , T1Q, T2Q > :: type が存在し、ここで TiQ TiQ < U > U Ti のCV修飾子と参照修飾子を追加したものとなる単項エイリアステンプレートである場合、メンバ型 type はその型を指す;
    • それ以外の場合、 decltype ( false ? val < T1 > ( ) : val < T2 > ( ) ) が有効な型である場合(ここで val は関数テンプレート template < class T > T val ( ) ; である)、メンバ型 type はその型を表す;
    • それ以外の場合、 std:: common_type_t < T1, T2 > が有効な型である場合、メンバ型 type はその型を表す;
    • それ以外の場合、メンバ type は存在しない。
  • sizeof... ( T ) が2より大きい場合(すなわち T... が型 T1, T2, R... から構成される場合)、 std :: common_reference_t < T1, T2 > が存在するとき、メンバ type std :: common_reference_t < std :: common_reference_t < T1, T2 > , R... > を表す(そのような型が存在する場合)。その他のすべての場合、メンバ type は存在しない。

2つの参照型 T1 T2 simple common reference type は以下のように定義されます:

  • T1 cv1 X& T2 cv2 Y& の場合(すなわち両方が左辺値参照型の場合): それらの単純な共通参照型は decltype ( false ? std:: declval < cv12 X & > ( ) : std:: declval < cv12 Y & > ( ) ) であり、ここで cv12 cv1 cv2 の和集合である。ただし、その型が存在し参照型である場合に限る。
  • T1 T2 が両方とも右辺値参照型の場合: T1& T2& の単純な共通参照型(前項に従って決定)が存在するならば、その型に対応する右辺値参照型を C とする。 std:: is_convertible_v < T1, C > std:: is_convertible_v < T2, C > が両方とも true である場合、 T1 T2 の単純な共通参照型は C である。
  • それ以外の場合、一方の型は左辺値参照型 A& で、他方は右辺値参照型 B&& でなければならない( A B はCV修飾されていてもよい)。 A & B const & の単純な共通参照型が存在する場合、それを D とする。 D が存在し、かつ std:: is_convertible_v < B && , D > true である場合、単純な共通参照型は D である。
  • それ以外の場合、単純な共通参照型は存在しない。

上記で使用されているような false ? X : Y という式の型の定義については、 条件演算子 を参照してください。

目次

メンバー型

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

ヘルパー型

template < class ... T >
using common_reference_t = 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 の結果に影響を与えることを可能にします。プライマリテンプレートは空です。

特殊化

プログラムは、最初の2つのパラメータ T U に対して std :: basic_common_reference < T, U, TQual, UQual > を特殊化してもよい。ただし、 std:: is_same_v < T, std:: decay_t < T >> std:: is_same_v < U, std:: decay_t < U >> がともに true であり、かつ少なくとも一方がプログラム定義型に依存している場合に限る。

そのような特殊化が type というメンバを持つ場合、それは TQual < T > UQual < U > の両方が変換可能な型を指す、公開かつ明確なメンバでなければなりません。さらに、 std :: basic_common_reference < T, U, TQual, UQual > :: type std :: basic_common_reference < U, T, UQual, TQual > :: type は同じ型を示さなければなりません。

プログラムは3番目または4番目のパラメータに対する basic_common_reference の特殊化を行ってはならず、 common_reference 自体の特殊化も行ってはなりません。これらの規則に違反して特殊化を追加するプログラムの動作は未定義です。

標準ライブラリは以下の特殊化を提供します: basic_common_reference

2つの pair の共通参照型を決定する
(クラステンプレートの特殊化)
tuple tuple-like 型の共通参照型を決定する
(クラステンプレートの特殊化)
reference_wrapper と非 reference_wrapper の共通参照型を決定する
(クラステンプレートの特殊化)

注記

機能テスト マクロ 標準 機能
__cpp_lib_common_reference 202302L (C++23) std::common_reference_t std::reference_wrapper を参照型にする

#include <concepts>
#include <type_traits>
static_assert(
    std::same_as<
        int&,
        std::common_reference_t<
            std::add_lvalue_reference_t<int>,
            std::add_lvalue_reference_t<int>&,
            std::add_lvalue_reference_t<int>&&,
            std::add_lvalue_reference_t<int>const,
            std::add_lvalue_reference_t<int>const&
        >
    >
);
int main() {}

関連項目

型のグループの共通型を決定する
(クラステンプレート)
2つの型が共通の参照型を共有することを指定する
(コンセプト)