C++编译器最烦人的分析机制



下面这行代码声明了一个带double参数并返回int的函数:

int f(double d);

下面这行做了同样的事情,参数d两边的括号是多余的,会被忽略:

int f(double (d));

下面这行声明了同样的函数,只是它省略了参数名称:

int f(double);

这三种形式除了第二种,我们应该都很熟悉。

下面我们在看三个函数声明。第一个声明了一个函数g,它的参数是一个指向不带任何参数的函数的指针,该函数返回double值:

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

有另外一种方式可表示同样的意思。唯一的却别是,pf用非指针的形式来声明(这种形式在C和C++中都有效):

int g(double pf());

跟通常一样,参数名称可以省略,因此下面是g的第三种声明,其中参数名pf被省略了:

int g(double ());

请注意围绕参数名的括号(比如对f的第二个声明中的d)与独立的括号的区别。围绕参数名的括号被忽略,而独立的括号则表示参数列表的存在;它们说明存在一个函数指针参数。熟悉了上面的声明后,我们来看下面的问题:

假设我们有一个存有整数(int)的文件,你想把这些整数拷贝到一个list中。下面是很合理的一种做法:

ifstream dataFile(“ints.dat”);

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

这段代码可以通过编译,但是在运行时,它什么也不会做。它不会从文件中读取任何数据,它不会创建list。这是因为第二条语句并没有声明一个list,也没有调用构造函数。它所做的是下面的事情:

它声明了一个函数data,其返回值是list<int>。data函数有两个参数:

第一个参数的名称是dataFile。它的类型是istream_iterator<int>。dataFile两边的括号会被忽略。

第二个参数没有名称。它的类型是指向不带参数的函数的指针,该函数返回一个istream_iterator<int>。

虽然令人吃惊,但却与C++中的一条普遍规律相符,即尽可能地解释为函数声明。再看下面的一种错误:

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

Widget w();

它没有声明名为w的Widget,而是声明了一个名为w的函数,该函数不带任何参数,并返回一个Widget。

我们想用文件的内容初始化list<int>对象,现在我们已经知道必须绕过某一种分析机制,剩下的事情就简单了。把形式参数的声明用括号括起来是非法的,但给函数参数加上括号却是合法的,所以通过增加一对括号,我们强迫编译器按我们的方式来工作:

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

不幸的是,并不是所有恶编译器都知道这一点。更好的方式是在对data的声明中避免使用匿名的istream_iterator<int>对象(尽管使用匿名对象是一种趋势),而是给这些迭代器一个名称。下面的代码应该总是可以工作的:

ifstream dataFile(“ints.dat”);

istream_iterator<int>dataBegin(dataFile);

istream_iterator<int> dataEnd;

list<int> data(dataBegin,dataEnd);

C++编译器最烦人的分析机制

时间: 2024-07-29 14:23:45

C++编译器最烦人的分析机制的相关文章

【S6】当心C++编译器最烦人的分析机制

1.考虑一个包含int的文件,复制到list,如下: ifstream dataFile("ints.bat"); list<int> data(istream_iterator<int>(dataFile),istream_iterator<int>());2.上面的代码不是预期的行为.3.先从最简单开始,声明方法 int f(double d); 等价的写法有 int f (double (d)); int f (double); 也就是说,形参

Jmeter之解决烦人的中文乱码问题

Jmeter是一款国外开源工具,所以就跟LR一样,对中文的支持不是很好,经常会有同学录制脚本后回放或者是发送HTTP请求,看到响应报文里面有乱码! 那如何才能解决这个问题呢?我们分2个情况来分析: 一.当响应报文里面有乱码或者是非中文的字符时,你可能看到的响应数据是这样的: 解决方案如下: 1)添加一个HTTP信息头管理器 2)添加一个Accept信息,添加内容如下: 为了大家省去手动敲打的时间,给你们附上一串信息: Accept   application/xml;application/js

Vue CLI 3开发中屏蔽烦人的EsLint错误

问题 Vue开发中,特别是当你阅读分析别人的其中早期版本的Vue代码时往往会遭遇到满屏幕的烦人的EsLint错误.有关EsLint这个工具的作用不再赘述.查阅网上参考文档,大多是针对早起版本Vue CLI工具项目的,在我最新使用的Vue CLI 3生成的工程中根本不起作用.无奈之下,认真学习了Vue CLI 3官方文档,终于找到最佳答案. 办法 Vue这个前端框架相对于React和Angular,入门会非常快.但是,到了中后期实战阶段仍然有许多工程实际问题需要我们一块一块地攻克.Vue CLI这

VIJOS PID221 / 烦人的幻灯片

 暴力出奇迹,古人诚不欺我. PID221 / 烦人的幻灯片 2017-04-14 19:47:08 运行耗时:30 ms 运行内存:12292 KB 查看最后一次评测记录 题目描述 李教授于今天下午做一个非常重要的演讲.不幸的是他不是一个非常爱整洁的人,他把自己做演讲要用的幻灯片随便堆放在一起.因此,演讲之前他不得不去整理这些幻灯片.做为一个讲求效率的学者,他希望尽可能简单地完成它.情况是这样,教授这次演讲一共要用n张幻灯片(n<=26),这n张幻灯片按照演讲要使用的顺序已经用数字1,2,-,

4735 烦人的幻灯片 (拓扑)

4735 烦人的幻灯片 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 帅气的作者将于今天下午作一次非常重要的演讲.不幸的是他不是一个非常爱整洁的人,他把自己演讲要用的幻灯片随便堆在了一起.因此,演讲之前他不得不去整理这些幻灯片.作为一个讲求效率的oier,他希望尽可能简单地完成它.帅气的作者这次演讲一共要用n张幻灯片(n<=26),这n张幻灯片按照演讲要使用的顺序已经用数字1~n编了号.因为幻灯片是透明的,所以我们不能一下子看

去除下载文件属性中烦人的锁定状态

我们用浏览器下载文件的时候,往往会附加一个锁定的状态,执行些被锁定的文时,会出现一个安全警告框. 要去除这个安全警告,必须在右键的属性选项中点击"解除锁定"的按钮: 虽然这个是为了安全考虑,但是很多时候还是觉得非常烦人的.之前在网上找了个注册表可以去掉这个自动锁定的功能,但最近重装系统后,发现这个烦人的特性又回来了.便再次搜索了一下,发现园子里有篇文章介绍得比较详细:Windows沙拉:为什么下载的文件打开时会有警告,而且会被"锁定"? 该文章也介绍了两种解决的方法

使用call、apply和bind解决js中烦人的this,事件绑定时的this和传参问题

1.什么是this 在JavaScript中this可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式,this 绑定的对象即函数执行的上下文环境(context). 为了帮助理解,让我们来一起看一段代码: // 作为对象方法调用 var test = { a : 5, b : 6, sum : function () { return this.a + this.b; // 此处this = test } } alert(test.sum()); // 11 作为对象调用时thi

centos7常见问题-解决烦人的声音

1.关闭Linux下Shell终端嘟嘟声和vi中错误提醒的Beep音 If you are using bash echo $0 vi /etc/inputrc set bell-style none 取消注释(取消蜂鸣音) 取消在vi错误提示音 rmmod pcspkr  ---临时关闭  modprobe pcspkr  --临时开启 永久 vi ~/.bashrc setterm –blength 0 #xset –b 保存重启永久生效.烦人的声音就没有了. ~~~~~~~~~~~~~~~

病毒&amp;烦人的幻灯片

<病毒>传送门 <烦人的幻灯片>传送门 病毒 描述 有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母. 现在怎么恢复原来的文档呢!小y很聪明,他在其他没有感染病毒的机器上,生成了一个由若干单词构成的字典,字典中的单词是按照字母顺序排列的,他把这个文件拷贝到自己的机器里,故意让它感染上病毒,他想利用这个字典文件原来的有序性,找到病毒替换字母的规律,再用来恢复其它文档. 现在你的任务