三种函数声明
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上成立 其他编译器未知