关于istream_iterator<int>(cin)和istream_iterator<int>()的一点分析
最近在看STL,其中讲到容器这一部分的时候,有以下两个式子,有点疑惑:
deque<int> c(istream_iterator<int>(cin), istream_iterator<int>()); () //函数声明
deque<int> c((istream_iterator<int>(cin)), (istream_iterator<int>())); () //定义一个容器
式子原本的含义都是要定义一个容器,容器的内容从标准输入获取。
这里主要分析下两个式子产生这种区别的原因:
1、式子(1),我们知道,c++中定义一个变量可以是:
<pre name="code" class="cpp">int a; //标准的定义,在声明式中也可以作为参数类型声明
int(a); //另一种定义,实际就是利用了括号的分割作用,与上一种本质相同
int(); //定义一个匿名的变量,在声明式中是作为一个函数声明,形同int (*)()
int(); //定义一个匿名变量,并用1初始化</pre>
注意上面几种形式,尤其是第三种形式是理解上述两个式子区别的关键。
好了,这样子的话,表达式中,
- istream_iterator<int>(cin)既可以理解为定义一个用cin去初始化的匿名istream_iterator<int>变量,也可以理解为定义一个知名变量,即istream_iterator<int> cin;
- istream_iterator<int>()可以理解为定义一个默认初始化的匿名变量,也可以理解为声明一个函数指针,即istream_iterator<int> (*)();
既然这样的话,对于(1)式,就用两种理解方式:
- 一是可以理解为c是一个函数声明,其参数是一个istream_iterator<int>变量,一个函数指针istream_iterator<int> (*)(),返回值是deque<int>;
- 二是可以理解为定义一个deque<int>的变量c,用两个iterator迭代器来对变量c进行初始化,因为deque有一种初始化方式就是deque<T> c(begin, end);
在这种情况下,编译器默认优先将(1)式理解为函数声明。
2、那么,为什么在(2)式中将参数加上括号后就可以避免这种歧义呢?
在c++中,函数的声明形式必须是 returnType fun(type1, type2, ...),对于returnType fun((type1),( type2), ...)的形式,是不能作为函数声明来通过编译的,由此,在(2)式中将参数都加上括号后,即可自动消除表达式是函数声明的可能,所以语义也就很清晰了,即定义一个容器。
由此得到的结论是:
编译器总是优先看作声明,其次看作表达式。
关于istream_iterator<int>(cin)和istream_iterator<int>()的一点分析的更多相关文章
- [C/C++] 输入函数getline(cin,str) 与cin.getline(str,int)区别
cin.getline()函数是处理数组字符串的,其原型为cin.getline(char * , int),第一个参数为一个char指针,第二个参数为数组字符串长度. getline(cin,str ...
- C++中int *p[4]和 int (*q)[4]的区别
这俩兄弟长得实在太像,以至于经常让人混淆.然而细心领会和甄别就会发现它们大有不同. 前者是指针数组,后者是指向数组的指针.更详细地说. 前: 指针数组;是一个元素全为指针的数组.后: 数组指针;可以直 ...
- C语言复杂声明-void (*signal(int sig, void (*handler)(int)))(int);
问题提出 请分析此声明:void (*signal(int sig, void (*handler)(int)))(int); 求解过程 在对上面的例子作分析之前,我们需要了解C语言的声明优先级,&l ...
- 编写Java应用程序。首先,定义描述学生的类——Student,包括学号(int)、 姓名(String)、年龄(int)等属性;二个方法:Student(int stuNo,String name,int age) 用于对对象的初始化,outPut()用于输出学生信息。其次,再定义一个主类—— TestClass,在主类的main方法中创建多个Student类的对象,使用这些对象来测 试Stud
package zuoye; public class student { int age; String name; int stuNO; void outPut() { System.out.pr ...
- const int * p 和 int const * p 和 int * const p 的区别
首先注意,const int * p 和int const *p 是一样的,并且不管是不是*p,即使const int i和int const i也是一样的,所以我们接下来只讨论int const * ...
- (int &)a 和(int)a
[cpp] view plain copy float a = 1.0f; cout < < (int)a < < endl; cout < < ...
- int * const 与 const int * 的区别
type * const 与 const type * 是在C/C++编程中特别容易混淆的两个知识点,现在就以 int * const 和 const int * 为例来简略介绍一下这两者之间的区别. ...
- open_clientfd(char* hostname,int port)和open_listenfd(int port)
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h&g ...
- 如何理解这段代码:void (*signal (int sinno,void(*func)(int)))(int)
void (*signal (int sinno,void(*func)(int)))(int) 先来看void(*func)(int) 这里的意思是声明一个函数指针func,它的参数类型为int ...
随机推荐
- qml性能优化(来源于群友分享);
Qt quick性能优化 使用时间驱动 避免定时轮询: 使用信号槽形式: 使用多线程 C++; QML WorkerScript元件: 使用Qt Quick Compiler 只需要再PRO文件中添加 ...
- SVN提交前准备
操作步骤1: 操作步骤2: 操作步骤3: 操作步骤4: 操作步骤5: 操作步骤6:查看 操作步骤7:ignore 操作步骤8:直接提交项目
- 2017-12-15python全栈9期第二天第七节之布尔值转数字
#!/user/bin/python# -*- coding:utf-8 -*-print(int(True))print(int(False))
- Maven 本地资源库配置
Maven 本地资源库配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.操作系统环境 1>.查看操作系统环境(总共3台虚拟机) 2>.关闭防火墙并禁用开机自启动( ...
- 比Kafka Mangaer更优秀的开源监控工具-Kafka Eagle
比Kafka Mangaer更优秀的开源监控工具-Kafka Eagle 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在Kafka的监控系统中有很多优秀的开源监控系统.比如Kaf ...
- nGrinder windows agent / linux agent
s ngrinder部署 https://blog.csdn.net/yue530tomtom/article/details/82113558 Windows机器启动不了ngrinder-agent ...
- Python中的格式化输出
百分号格式化输出 百分号默认右对齐 %s 字符串 (采用str()的显示) %r 字符串 (采用repr()的显示) %c 单个字符 %b 二进制整数 %d 十进制整数 %i 十进制整数 %o 八进制 ...
- JAVA核心技术I---JAVA基础知识(数据结构基础)
一:数组 (一)基本内容是与C一致的 (二)数组定义和初始化 (1)声明 int a[]; //a没有new操作,没有被分配内存,为null int[] b; //b没有new操作,没有被分配内存,为 ...
- Sublime Text3 里使用MarkDown如何预览
安装需要的包: 1.markdown editing 2.markdown preview 具体的步骤是: 1.按住ctrl + shift + p 来调出一个弹出的输入框 :2.输入package ...
- chart.js angular组件封装(ng6)、实战配置、插件编写
前言 项目需要使用chart.js插件,由于项目是使用angular开发,那么我第一步就是先把chart.js改造成angular组件来使用. 本项目代码都可以在github上下载:项目git地址 a ...