名稱空間
變體
操作

std::experimental::ranges::common_reference

來自 cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
實驗性
技術規範
檔案系統庫 (檔案系統 TS)
庫基礎 (庫基礎 TS)
庫基礎 2 (庫基礎 TS v2)
庫基礎 3 (庫基礎 TS v3)
並行性擴充套件 (並行性 TS)
並行性擴充套件 2 (並行性 TS v2)
併發性擴充套件 (併發性 TS)
併發擴充套件2 (併發TS v2)
概念 (概念 TS)
範圍 (範圍 TS)
反射 (反射 TS)
數學特殊函式 (特殊函式 TR)
實驗性非 TS
模式匹配
線性代數
std::execution
契約
2D 圖形
 
 
通用工具庫
實用元件
函式物件
超程式設計和型別特徵
common_reference
帶標籤的對和元組
                          
tag specifiers
                                      
                          
 
定義於標頭檔案 <experimental/ranges/type_traits>
template< class... T >
struct common_reference;
(ranges TS)

確定型別 T... 的公共引用型別,即 T... 中所有型別都可以轉換或繫結的型別。如果存在這樣的型別(根據以下規則確定),則成員 type 命名該型別。否則,沒有成員 type。如果 T... 中的任何型別是不完整的型別,而不是(可能帶有 cv 限定符的)void,則行為未定義。

當給定引用型別時,common_reference 嘗試查詢一個引用型別,所有提供的引用型別都可以繫結到該引用型別,但如果找不到這樣的引用型別,則可能返回一個非引用型別。

  • 如果 sizeof...(T) 為零,則沒有成員 `type`。
  • 如果 sizeof...(T) 為一(即,T... 只包含一個型別 T0),則成員 type 命名與 T0 相同的型別。
  • 如果 sizeof...(T) 為二(即,T... 包含兩個型別 T1T2):
    • 如果 T1T2 都是引用型別,並且 T1T2簡單公共引用型別 S(定義如下)存在,則成員型別 type 命名 S
    • 否則,如果 basic_common_reference<T1R, T2R, T1Q, T2Q>::type 存在,其中 TiRstd::remove_cv_t<std::remove_reference_t<Ti>>TiQ 是一個別名模板,使得 TiQ<TiR>Ti,則成員型別 type 命名該型別;
    • 否則,如果 decltype(false? val<T1>() : val<T2>()),其中 val 是函式模板 template<class T> T val();,表示一個有效型別,則成員型別 type 命名該型別;
    • 否則,如果 ranges::common_type_t<T1, T2> 是一個有效型別,則成員型別 type 命名該型別;
    • 否則,沒有成員型別。
  • 如果 sizeof...(T) 大於二(即,T... 由型別 T1, T2, R... 組成),那麼如果 ranges::common_reference_t<T1, T2> 存在,則成員 type 表示 ranges::common_reference_t<ranges::common_reference_t<T1, T2>, R...>(如果存在這樣的型別)。在所有其他情況下,沒有成員 type

兩個引用型別 T1T2簡單公共引用型別定義如下:

  • 如果 T1cv1 X &T2cv2 Y &(即,兩者都是左值引用型別):它們的簡單公共引用型別是 decltype(false? std::declval<cv12 X &>() : std::declval<cv12 Y &>()),其中 cv12cv1cv2 的並集,如果該型別存在且是引用型別。
  • 如果 T1T2 都是右值引用型別:如果 T1 &T2 & 的簡單公共引用型別(根據上一條確定)存在,則令 C 表示該型別對應的右值引用型別。如果 std::is_convertible<T1, C>::valuestd::is_convertible<T2, C>::value 都為 true,則 T1T2 的簡單公共引用型別是 C
  • 否則,兩種型別之一必須是左值引用型別 A &,另一種必須是右值引用型別 B &&AB 可能帶有 cv 限定符)。令 D 表示 A &B const & 的簡單公共引用型別(如果有)。如果 D 存在且 std::is_convertible<B &&, D>::valuetrue,則簡單公共引用型別是 D
  • 否則,沒有簡單公共引用型別。

目錄

[編輯] 成員型別

名稱 定義
型別 所有 T... 的公共引用型別

[編輯] 輔助型別

template< class... T >
using common_reference_t = typename 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 並且其中至少一個依賴於程式定義型別,則程式可以對 basic_common_reference<T, U, TQual, UQual> 的前兩個引數 TU 進行特化。

如果這樣的特化有一個名為 type 的成員,它必須是一個公共且無歧義的成員型別,它命名一個型別,TQual<T>UQual<U> 都可以轉換為該型別。此外,ranges::basic_common_reference<T, U, TQual, UQual>::typeranges::basic_common_reference<U, T, UQual, TQual>::type 必須表示相同的型別。

程式不得對 basic_common_reference 的第三或第四個引數進行特化,也不得特化 common_reference 本身。違反這些規則新增特化的程式具有未定義行為。

[編輯] 注意

[編輯] 示例

[編輯] 另請參閱

確定一組型別的公共型別
(類模板) [編輯]
確定一組型別的公共型別
(類模板) [編輯]
指定兩種型別共享一個共同的引用型別
(概念) [編輯]