3

在 Nicolai M. Josuttis 的《Cpp 标准库》第 2 版一书中,说 (5.4, p.125) struct common type 的定义如下:

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?
4

1 回答 1

4

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

ISO C++11标准5.16段:

否则,如果第二个和第三个操作数具有不同的类型并且具有(可能是 cv 限定的)类类型,或者如果两者都是相同值类别和相同类型(除了 cv 限定)的 glvalue,则尝试转换每个这些操作数的类型到另一个的类型。

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

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

使用该过程,确定是否可以转换第二操作数以匹配第三操作数,以及是否可以转换第三操作数以匹配第二操作数。如果两者都可以转换,或者一个可以转换但转换不明确,则程序格式错误。如果两者都不能转换,则操作数保持不变,并按如下所述执行进一步检查。如果恰好可以进行一次转换,则该转换将应用于所选操作数,并且在本节的其余部分中使用转换后的操作数代替原始操作数。

于 2012-11-07T12:38:02.347 回答