以下是 std::common_type
的特化之一。
template <class T, class U>
struct common_type<T, U> {
typedef decltype(true ? declval<T>() : declval<U>()) type;
};
我的想法是,条件语句是不必要的。如果要检查
true
,表达式是否会始终解析为declval<T>()
?如果是这样,返回的typedef如何证明定义的合理性...有人可以解释条件声明吗?对
true
的检查是多余的并且条件将始终解析为第一个操作数是否准确?如果是这样,返回的类型如何满足定义? 最佳答案
三元运算符的类型不仅是编译器知道必须采用的分支的类型。如果存在这样的类型,则这是两个分支都通用的类型。如果没有这样的类型,则编译将失败。三元运算符是唯一具有该属性的运算符,它可以将其转换为表达式的普通类型,而不是转换为两个值的表达式的结果。也就是说,仅滥用三元运算符来获取公共(public)类型。但是,条件并不重要。
标准中的相关部分为5.16 [expr.cond]第3段:
本段后面是如何提供通用类型的规则。否则是指第二个或第三个表达式是throw-expression或第二个或第三个表达式之一或两者具有void
类型的情况。