common_type的可疑定义

Questionable definition of common_type

本文关键字:定义 type common      更新时间:2023-10-16

在书中" CPP标准库"中,第二版,尼古拉·乔索蒂斯(Nicolai M.

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?

这全都与条件运算符有关。它不是选择语句喜欢或开关。

5.16 ISO C 11标准:

否则,如果第二和第三操作数具有不同的类型,并且具有(可能是CV合格的)类 类型,或者两者都是同一值类别的Glvalues,而同一类型的类型除外 试图将这些操作数中的每一个转换为另一个类型。

因此,声明包含真正条件并不重要,编译器必须选择常见的类型。

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

使用此过程,确定第二操作数是否可以是 转换以匹配第三操作数,以及第三操作数是否 可以转换以匹配第二操作数。如果两者都可以 转换,或者可以转换一个,但转换是模棱两可的, 该程序形式不佳。如果两者都无法转换,操作数将 保持不变,并如上所述进行进一步检查 以下。如果完全可以进行一次转换,则转换是 应用于所选操作数,并使用了转换后的操作数 本节其余部分的原始操作数的位置。