这段时间看C++标准库,看到有一个求公共类型的实用函数common_type<>;其实现是如下:
template<typename T1,typename T2> struct common_type<T1,T2> { typedef decltype(true?declval<T1>(),declval<T2>()) type; }刚开始还觉得奇怪,条件永远为true,不就是直接计算T1吗,想当然的以为产生公共类型不就是T1的类型吗?后然通过一个实例上机实验才发现不是这么回事。于是找到关于条件运算符的说明;我们知道条件运算符?:是C++中唯一的一个三目运算符。用法
expression ? expression : expression
下面是msdn对条件运算符的解释。from:http://msdn.microsoft.com/en-us/library/e4213hs1(v=vs.110).aspx
The conditional operator (? :) is a ternary operator (it takes three operands). The conditional operator works as follows:
The first operand is implicitly converted tobool. It is evaluated and all side effects are completed before continuing.
第一个操作数自动转换成bool类型值。
If the first operand evaluates totrue(1), the second operand is evaluated.
If the first operand evaluates tofalse(0), the third operand is evaluated.
The result of the conditional operator is the result of whichever operand is evaluated — the second or the third. Only one of the last two operands is evaluated in a conditional expression.
Conditional expressions have right-to-left associativity(从右至左结合性). The first operand must be of integral or pointer type. The following rules apply to the second and third expressions:
If both expressions are of the same type, the result is of that type.
If both expressions are of arithmetic or enumeration types, the usual arithmetic conversions (covered inArithmetic Conversions) are performed to convert them to a common type. //如果两个表达式类型不相同,但是都是算术或者是枚举类型。那么算术转换将他们转换成共同类型。
If both expressions are of pointer types or if one is a pointer type and the other is a constant expression that evaluates to 0, pointer conversions are performed to convert them to a common type. //指针类型转换
If both expressions are of reference types, reference conversions are performed to convert them to a common type. //引用类型转换
If both expressions are of type void, the common type is type void. //void 最低级的类型
If both expressions are of a given class type, the common type is that class type. //类类型的基本转换是他的基类的类型。
Any combinations of second and third operands not in the preceding list are illegal. The type of the result is the common type, and it is an l-value if both the second and third operands are of the same type and both are l-values.
通过上面的说明可以看到common_type是通过隐式类型转换来实现的。看来对一些基本概念的掌握还是不牢固啊。