std::experimental::ranges::common_reference
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...
包含兩個型別T1
和T2
):- 如果
T1
和T2
都是引用型別,並且T1
和T2
的簡單公共引用型別S
(定義如下)存在,則成員型別type
命名S
; - 否則,如果 basic_common_reference<T1R, T2R, T1Q, T2Q>::type 存在,其中
TiR
是 std::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
。
兩個引用型別 T1
和 T2
的簡單公共引用型別定義如下:
- 如果
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<T1, C>::value 和 std::is_convertible<T2, C>::value 都為true
,則T1
和T2
的簡單公共引用型別是C
。 - 否則,兩種型別之一必須是左值引用型別
A &
,另一種必須是右值引用型別B &&
(A
和B
可能帶有 cv 限定符)。令D
表示 A & 和 B const & 的簡單公共引用型別(如果有)。如果 D 存在且 std::is_convertible<B &&, D>::value 為true
,則簡單公共引用型別是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>
的前兩個引數 T
和 U
進行特化。
如果這樣的特化有一個名為 type
的成員,它必須是一個公共且無歧義的成員型別,它命名一個型別,TQual<T> 和 UQual<U> 都可以轉換為該型別。此外,ranges::basic_common_reference<T, U, TQual, UQual>::type 和 ranges::basic_common_reference<U, T, UQual, TQual>::type 必須表示相同的型別。
程式不得對 basic_common_reference
的第三或第四個引數進行特化,也不得特化 common_reference
本身。違反這些規則新增特化的程式具有未定義行為。
[編輯] 注意
本節不完整 |
[編輯] 示例
本節不完整 原因:無示例 |
[編輯] 另請參閱
(C++11) |
確定一組型別的公共型別 (類模板) |
確定一組型別的公共型別 (類模板) | |
指定兩種型別共享一個共同的引用型別 (概念) |