Effective STL 第六条 当心C++编译器最烦人的分析机制

来源:互联网 发布:淘宝店铺广告语 编辑:程序博客网 时间:2024/05/21 08:46

三种函数声明

int f(double (d));

int f(double d);

int f(double );

int g(double (*pf)());

int g(double pf());  //pf为隐式指针

int g(double());

注意围绕参数名的括号:

围绕参数名的括号被忽略,而独立的括号表明参数列表的存在;它们说明存在一个函数指针参数

ifstream dataFile("ints.dat");

list<int> data(istream_iterator<int>(dataFile),

      istream_iterator<int>());//被分析成函数声明,而不是变量定义

在比如

class Widget{...}  //假定Widget 有默认构造函数


Widget w();//不是声明名为w的变量 而是声明了一个名为w的函数,该函数不带任何参数

注意:把形参的声明用括号括起来是非法的,但给函数参数加上括号却是合法的 所以通过增加一对括号,强迫编译器按我们的方式来工作

list<int> data((istream_iterator<int>(dataFile)),

istream_iterator<int>());

并不是所有的编译器都知道这点(作者当时的说法)

更好的方式是 在对data声明书避免使用匿名的istream_iterator对象

ifstream data("ints.dat");

istream_iterator<int>  dataBegin(dataFile);

istream_iterator<int> dataEnd;


list<int> data(dataBegin,dataEnd);


以上在vs2013上成立 其他编译器未知

0 0
原创粉丝点击