以下是 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类型的情况。

10-08 04:15