common_type的可疑定义

时间:2012-11-07 12:27:08

标签: c++ c++11 std conditional-operator

在“Cpp标准库”第2版中,作者Nicolai M. Josuttis说,(5.4,第125页)结构共同类型的定义如下:

template <typename T1, typename T2>
struct common_type<T1,T2> {
typedef decltype(true ? declval<T1>() : declval<T2>()) type;
};

我有严重的问题要相信这是common_type的正确定义。原因:

typedef decltype(true ? declval<T1>() : declval<T2>()) type;//As far as I understand this will always pick second operand, declval<T1>(), due to the fact that there is 'true' value. Am I right?

1 个答案:

答案 0 :(得分:4)

这都是关于条件运算符的。 不是选择语句,如if或switch。

5.16 ISO C ++ 11标准段落:

  

否则,如果第二个和第三个操作数具有不同的类型并且具有(可能是cv-qualified)类   类型,或者如果两者都是相同值类别和相同类型的glvalues,除了cv-qualification,an   尝试将每个操作数转换为另一个操作数的类型。

因此,decltype包含true条件并不重要,编译器必须选择公共类型作为结果。

UPD: 5.16包含对正确行为的进一步描述,您应该看到它以完全理解整个过程。但是对于你的特定问题:

  

使用此过程,确定第二个操作数是否可以   转换为匹配第三个操作数,以及是否为第三个操作数   可以转换为匹配第二个操作数。如果两者都可以   转换,或者一个可以转换,但转换是模糊的,   该计划格式不正确。如果两者都不能转换,则操作数   保持不变,并如所述进行进一步检查   下面。如果只能进行一次转换,则转换为   应用于所选操作数,并使用转换后的操作数   本节其余部分的原始操作数的位置。