zoukankan      html  css  js  c++  java
  • 关于istream_iterator<int>(cin)和istream_iterator<int>()的一点分析

    最近在看STL,其中讲到容器这一部分的时候,有以下两个式子,有点疑惑:

    1 deque<int> c(istream_iterator<int>(cin), istream_iterator<int>()); (1//函数声明  
    2 deque<int> c((istream_iterator<int>(cin)), (istream_iterator<int>())); (2//定义一个容器  

    式子原本的含义都是要定义一个容器,容器的内容从标准输入获取。

    这里主要分析下两个式子产生这种区别的原因:

    1、式子(1),我们知道,c++中定义一个变量可以是:

    1 <pre name="code" class="cpp">int a;   //标准的定义,在声明式中也可以作为参数类型声明  
    2 int(a); //另一种定义,实际就是利用了括号的分割作用,与上一种本质相同  
    3 int();   //定义一个匿名的变量,在声明式中是作为一个函数声明,形同int (*)()  
    4 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)式中将参数都加上括号后,即可自动消除表达式是函数声明的可能,所以语义也就很清晰了,即定义一个容器。

    由此得到的结论是:

    编译器总是优先看作声明,其次看作表达式。

    在代码的世界尽情的翱翔吧!
  • 相关阅读:
    Centos7重置Mysql 8.0.1 root 密码
    MysQL使用一高级应用(下)
    MysQL使用一高级应用(上)
    MysQL使用一查询
    MysQL使用一创建库与表
    OSI七层协议模型、TCP/IP四层模型学习笔记
    python-作用域和装饰器
    python-正则表达式RE
    python-高阶函数和闭包
    python-内置函数及捕获异常
  • 原文地址:https://www.cnblogs.com/maleyang/p/7301649.html
Copyright © 2011-2022 走看看