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。 - 否则,不存在简单公共引用类型。
目录 |
成员类型
| 名称 | 定义 |
type
|
所有
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
结果。主模板为空。
特化
程序可以在前两个参数
T
和
U
上特化
basic_common_reference<T, U, TQual, UQual>
,前提是
std::
is_same
<
T,
std::
decay_t
<
T
>>
与
std::
is_same
<
U,
std::
decay_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)
|
确定一组类型的公共类型
(类模板) |
|
确定类型集合的公共类型
(类模板) |
|
|
指定两种类型共享一个公共引用类型
(概念) |