《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吧,没错的。
[解决办法]