这段时间看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是通过隐式类型转换来实现的。看来对一些基本概念的掌握还是不牢固啊。
分享到:
相关推荐
- 条件运算符:? :是C++中唯一的三元运算符,用于基于条件表达式选择两个值中的一个。 C++数组和指针: - 数组:用于存储一系列相同类型的数据。例如,int cj[30]定义了一个包含30个整数的数组。 - 指针:是一种...
首先,我们要了解C++中的基本运算符类型: 1. **算术运算符**:包括加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。它们用于执行基本的数学运算。例如,`5 + 3`的结果是8,`10 / 2`的结果是5。需要注意的...
8. **运算符重载**:C++允许通过`operator`关键字重载运算符,使其能用于自定义类型的对象。 9. **运算符重载的实例**:运算符+在整型和浮点型变量中的不同应用是运算符重载的例子。 10. **成员函数重载运算符**:...
6. **条件运算符**: `(条件) ? 表达式1 : 表达式2`,例如: ```cpp int x = (a > b) ? a : b; // 如果a>b,则x=a;否则x=b ``` #### 八、控制结构 1. **条件语句**: - `if`: 根据条件执行代码块。 - `if-else...
18. **禁止重载的运算符**:包括成员指针访问运算符(.*),域运算符(::),sizeof运算符,条件运算符(?:),成员访问符(.)。 19. **运算符重载方式**:普通函数、友元函数和类成员函数。 20. **流运算符重载*...
:`条件运算符,`*`成员指针运算符,以及`sizeof()`运算符。 10. **只能用类重载的运算符**:`=`, `()`, `[]`, `*`这四个运算符只能通过类的成员函数来重载。 11. **格式宽度控制**:C++提供了`width(int val)`、`...
1. 变量和数据类型:理解各种基本数据类型如int、float、char,以及它们的存储需求和使用场景。 2. 运算符:掌握基本运算符,如算术运算符、比较运算符、逻辑运算符和位运算符。 3. 控制结构:了解条件语句(if-else...
还有条件运算符(`?:`),如`max=(a>b)?a:b`,根据条件选择返回`a`或`b`。指针运算符(`*`和`&`)用于获取变量的地址和解引用。此外,C++还支持运算符重载,使得类的对象可以直接进行加减乘除等操作。 【C++类】 ...
1. C++基础知识:C++作为一种高级编程语言,其基础知识包括变量、数据类型、运算符、控制结构(如条件语句和循环)、函数、数组、指针和引用等。这些都是程序员编写程序时必须掌握的基本概念。 2. 面向对象编程...
3. 数据类型:包括基本数据类型(整型、浮点型、字符型等)、复合数据类型(数组、结构体、枚举)及其使用方法。 4. 变量与常量:理解变量的声明、初始化和作用域,以及常量的定义与使用。 5. 运算符:讲解各种...
- 数据类型:包括基本类型(如int、float、char等)、指针类型和自定义类型(类)。 - 运算符:包括算术运算符、比较运算符、逻辑运算符、赋值运算符等。 - 流程控制:if-else、switch-case、for、while和do-...
:(条件运算符)和.(成员访问)。 19. 运算符重载的三种方式是:普通函数、友元函数和类成员函数。 20. 流运算符(和>>)通常通过友元函数重载,因为成员函数重载需要第一个参数是当前类的对象。 21. 赋值...
17. **不允许重载的运算符**:成员指针访问运算符(.*)、域运算符(::)、sizeof运算符、条件运算符(?:)和成员访问运算符(.)。 18. **运算符重载的方式**:通过普通函数、友元函数和类成员函数实现。 19. **...
- 数据类型:C++支持基本数据类型(如int、char、float、double等),以及自定义的数据类型(如struct和class)。 - 变量:存储数据的内存位置,需要先声明后使用。 - 运算符:包括算术运算符(+、-、*、/、%)、...
- 变量与数据类型:C++支持基本的数据类型如int、float、char,以及结构体、枚举等复杂类型。 - 运算符:包括算术运算符、关系运算符、逻辑运算符等,以及C++特有的重载运算符。 - 控制流:如if条件语句、switch...
1. 变量与数据类型:C++支持基本数据类型(如int、float、char)以及复杂数据类型(如结构体、枚举)。变量声明时需要指定数据类型,并进行初始化。 2. 运算符:包括算术运算符、比较运算符、逻辑运算符、赋值运算符...
1. 变量与数据类型:C++支持基本数据类型(如int、float、char)以及复杂数据类型(如结构体、联合体)。变量是存储数据的容器,理解它们的声明、初始化和使用至关重要。 2. 运算符:C++包含丰富的运算符,包括算术...