在“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?
答案 0 :(得分:4)
这都是关于条件运算符的。 不是选择语句,如if或switch。
5.16 ISO C ++ 11标准段落:
否则,如果第二个和第三个操作数具有不同的类型并且具有(可能是cv-qualified)类 类型,或者如果两者都是相同值类别和相同类型的glvalues,除了cv-qualification,an 尝试将每个操作数转换为另一个操作数的类型。
因此,decltype包含true条件并不重要,编译器必须选择公共类型作为结果。
UPD: 5.16包含对正确行为的进一步描述,您应该看到它以完全理解整个过程。但是对于你的特定问题:
使用此过程,确定第二个操作数是否可以 转换为匹配第三个操作数,以及是否为第三个操作数 可以转换为匹配第二个操作数。如果两者都可以 转换,或者一个可以转换,但转换是模糊的, 该计划格式不正确。如果两者都不能转换,则操作数 保持不变,并如所述进行进一步检查 下面。如果只能进行一次转换,则转换为 应用于所选操作数,并使用转换后的操作数 本节其余部分的原始操作数的位置。