首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

《C++的十万个为啥》[15]程序二义性在函数中出现的情况

2012-10-13 
《C++的十万个为什么》[15]程序二义性在函数中出现的情况原文来自http://chenlq.net/15-program-ambiguity-f

《C++的十万个为什么》[15]程序二义性在函数中出现的情况
原文来自
http://chenlq.net/15-program-ambiguity-function.html

Q:

除了在上一篇章文章所展示的那种出现在类当中程序二义性以外,还有什么其他典型情况?

A:

除此之外,在Wiki还展示了另外一种二义性出现在函数中的情况。考虑如下代码:
1
2
3

void foo(double d) {
  int i(int(d));
}

第一眼,我们也许会自然地认为“int i(int(d));”的意义就是将double类型的变量转换为int类型,然后用来初始化变量i。
然而,编译器却不这么想,因为C++标准中规定可以用“int(d)”的形式定义一个变量d,而当变量定义和函数调用同时有意义时,C++标准默认前者。所以,这段代码在编译器看来却成了声明一个函数名为i,返回值为int,参数类型为int,参数名为d的函数。等同于:
1

int i(int d); // 这不就是一个典型的函数声明?

程序员和编译器对代码的不同理解,就构成了代码的二义性 。
那么,如何解决呢?既然二义性是因为程序员和编译器对代码的不同理解造成的,那么,只要我们用一些辅助的形式将代码的意义明确下来就可以了。
这里,我们还是可以采取在 [14]由程序员丈夫买鸡蛋引出的程序二义性问题:对象定义与函数调用中介绍的方法:
第一种,C++风格的类型转换
1
2
3

void foo(double d) {
  int i(static_cast<int>(d)); // 定义变量i
}

第二种,使用C++11中的{}初始化列表方法
1
2
3

void foo(double d) {
  int i{d}; // 定义变量i
}

总的来看,还是C++11的方法要简便一些。所以,赶快学习C++11吧,没错的。

[解决办法]

热点排行