zoukankan      html  css  js  c++  java
  • 由于C++编译器的分析机制所导致的声明问题

    假设我们想声明一个STL的vector类型的变量,读入文件里的信息:

    std::ifstream in("data.txt");
    std::vector<int> data(std::istream_iterator<int>(in),std::istream_iterator<int>());
    

    之后我们引用data的元素时,会发现编译器报错。为什么呢,让我们来分析一下:

    在此时的编译器看来,我们实际上声明的是一个函数,它的返回值是vector,参数有两个,第一个参数为一个istream_iterator对象,第二个参数为一个无参数的,返回istream_iterator的函数指针

    造成这种现象是因为C++的编译机制会尽量将语句解释为函数声明。

    这种现象实际上并不稀奇,比如如下一段代码你或许也见过:

    class Widget
    {...};    //内部有一个默认构造函数
    Widget w();//此时编译器会将w看做一个函数声明    
    

    解决这种问题的一个方法是给第一个参数加一个括号:

    std::vector<int> data((std::istream_iterator<int>(in)),std::istream_iterator<int>());
    

    C++不允许给函数的形参加括号,但允许给函数的实参加括号。这样一来编译器就确认data是一个vector对象了。

    当然,治本的方法还是使用临时变量:

    std::ifstream in("data.txt");
    std::istream_iterator dataBegin(in);
    std::istream_iterator dataEnd;
    std::vector<int> data(dataBegin,dataEnd);
    

    此博客内容参考《Effective STL》第6条。

  • 相关阅读:
    android so壳入口浅析
    PySide图形界面开发(一)
    对一个伪装成微信的加固病毒的分析
    ZjDroid工具介绍及脱壳详细示例
    用pyinstaller把python代码打包成exe可执行文件
    Android下so注入汇总
    利用drozer进行Android渗透测试
    OWASP移动安全漏洞Top 10
    python with原理
    腾讯云
  • 原文地址:https://www.cnblogs.com/wickedpriest/p/5923747.html
Copyright © 2011-2022 走看看