关于istream_iterator<int>(cin)和istream_iterator<int>()的一点分析
来源:互联网 发布:controlnet网络优缺点 编辑:程序博客网 时间:2024/05/20 21:46
最近在看STL,其中讲到容器这一部分的时候,有以下两个式子,有点疑惑:
- deque<int> c(istream_iterator<int>(cin), istream_iterator<int>()); (1) //函数声明
- deque<int> c((istream_iterator<int>(cin)), (istream_iterator<int>())); (2) //定义一个容器
式子原本的含义都是要定义一个容器,容器的内容从标准输入获取。
这里主要分析下两个式子产生这种区别的原因:
1、式子(1),我们知道,c++中定义一个变量可以是:
- <pre name="code" class="cpp">int a; //标准的定义,在声明式中也可以作为参数类型声明
- int(a); //另一种定义,实际就是利用了括号的分割作用,与上一种本质相同
- int(); //定义一个匿名的变量,在声明式中是作为一个函数声明,形同int (*)()
- int(1); //定义一个匿名变量,并用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)式中将参数都加上括号后,即可自动消除表达式是函数声明的可能,所以语义也就很清晰了,即定义一个容器。
由此得到的结论是:
编译器总是优先看作声明,其次看作表达式。
0 0
- 关于istream_iterator<int>(cin)和istream_iterator<int>()的一点分析
- istream_iterator的一点感悟
- istream_iterator
- istream_iterator
- C++ istream_iterator以及cin输入的一些问题
- istream_iterator和ostream_iterator的简单使用
- istream_iterator创建和值的变化
- istream_iterator和ostream_iterator学习体会
- istream_iterator和ostream_iterator
- istream_iterator和ostream_iterator学习体会
- istream_iterator和ostream_iterator使用
- ostream_iterator和istream_iterator使用杂谈
- istream_iterator ostream_iterator 迭代器和IO
- istream_iterator常见的错误说明
- istream_iterator 与ostream_iterator的用法
- C++中流迭代器istream_iterator 和 ostream_iterator的使用
- STL中istream_iterator和ostream_iterator的基本用法
- STL中istream_iterator和ostream_iterator的基本用法
- 用Excel和DOS命令的方法批量修改文件名
- 其他博客
- JSTL中截取一定长度的字符串
- java的正则表达式使用
- Android内存优化大全(2)
- 关于istream_iterator<int>(cin)和istream_iterator<int>()的一点分析
- 启用 jstatd 供远程VisualVM 连接
- 期末刷oj ——用数字造数字
- android升级到5.0的出现的问题及解决办法
- MFC 内部组织结构(简单单文档)
- Android内存优化大全(3)
- 【命学释疑之何为命】一个程序员对算命的剖析
- 构建自己的AngularJS,第一部分:作用域和digest
- 期末刷oj——找出素数