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

5 篇文章 0 订阅
本文介绍了C++中容易引发混淆的函数声明问题,包括参数列表的括号使用、函数指针声明以及匿名对象在初始化列表中的解析。举例展示了如何不小心将变量声明错误地解析为函数声明,以及解决这类问题的方法,如利用额外的括号或者明确创建对象实例。需要注意,不同编译器对此可能有不同的处理方式。
摘要由CSDN通过智能技术生成

三种函数声明

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上成立 其他编译器未知

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值