返回信息流#include <iostream>
#include <string>
using namespace std;
void a(bool input)
{
cout<<"I amd first"<<endl;
cout<<input<<endl;
}
void a(const string &input)
{
cout<<"I amd second"<<endl;
cout<<input<<endl;
}
int main(int argc,char **argv)
{
a("str"); // 是调用第二个a函数吗?
a(string("str"));
return 0;
}
以下是运行结果:
I amd first
1
I amd second
str
原文链接:http://blogread.cn/it/article/3046?f=wb2
刚才试了试,把void a(bool input)改成 void a(bool &input)可以避免此处的歧义。想问传引用是否可以避免所有的此类因为参数的隐式转换而引起的歧义。
这是一条镜像帖。来源:北邮人论坛 / cpp / #74683同步于 2013/10/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
函数重载与隐式转换产生的歧义
hdj
2013/10/21镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
《More effective c++》-----通过重载来避免隐式类型转换
在一些时候函数的调用会产生隐式的类型转换,如通过定义自定义转换算子,还有就是单参数的函数等来实现。但我们知道在进行隐式的类型转换的时候会产生一个匿名的临时对象,这不是我们所希望的,因为对象的构造会调用它的构造函数和在结束的时候会相应的调用它的析构函数,这些没有必要的消毫不是我们所希望的。当然这个临时对象的产生也是有条件的,就是函数的参数是通过按值传递或者是传递给一个常引用。
我们需要对我们的一些函数进行优化,这些优化主要发生在会因为类型不匹配而发生隐式类型转换的地方,这当然需要程序员自己留心了。具体的方法就是通过重载这个函数,让它在可能发生隐式类型转换的时候(当然是没有写重载函数的时候)来选择最优的函数进行执行,从而避免了临时对象的产生。
楼主上面的修改就是把参数传入方式变成非常引用,避免了隐式类型转换。
隐式类型转换对于单变量的类的构造函数也有影响,不过是另一个话题,上面的书也有专门的条款讨论,建议看看。
【 在 rollse 的大作中提到: 】
: 《More effective c++》-----通过重载来避免隐式类型转换
: 在一些时候函数的调用会产生隐式的类型转换,如通过定义自定义转换算子,还有就是单参数的函数等来实现。但我们知道在进行隐式的类型转换的时候会产生一个匿名的临时对象,这不是我们所希望的,因为对象的构造会调用它的构造函数和在结束的时候会相应的调用它的析构函数,这些没有必要的消毫不是我们所希望的。当然这个临时对象的产生也是有条件的,就是函数的参数是通过按值传递或者是传递给一个常引用。
: 我们需要对我们的一些函数进行优化,这些优化主要发生在会因为类型不匹配而发生隐式类型转换的地方,这当然需要程序员自己留心了。具体的方法就是通过重载这个函数,让它在可能发生隐式类型转换的时候(当然是没有写重载函数的时候)来选择最优的函数进行执行,从而避免了临时对象的产生。
: ...................
谢谢讲解,刚准备看《effective c++》。再问一下字符对齐是什么?
这个比较复杂,对于结构,类和union来说,涉及到sizeof的结果,网上有很多文章,你可以搜搜看,讨论的很充分了。
PS,sizeof结果是很多公司笔试面试的考察范围,要搞定这些,掌握字符对齐就有必要。
当然,在你手动分配内存的涉及到sizeof,这是理解字符对齐的最重要原因。
下面这个帖子就涉及到这些知识:
http://bbs.byr.cn/wForum/disparticle.php?boardName=CPP&ID=74639&pos=12
struct的sizeof值的确定。
【 在 rollse 的大作中提到: 】
: 这个比较复杂,对于结构,类和union来说,涉及到sizeof的结果,网上有很多文章,你可以搜搜看,讨论的很充分了。
: PS,sizeof结果是很多公司笔试面试的考察范围,要搞定这些,掌握字符对齐就有必要。
: 当然,在你手动分配内存的涉及到sizeof,这是理解字符对齐的最重要原因。
: ...................
赞