大佬教程收集整理的这篇文章主要介绍了c – 为什么这个对成员函数的调用是模糊的?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
class Base{ public: void func(double a) = delete; void func(int a) const {} }; int main(){ Base base; base.func(1); return 0; }
当使用clang编译时,会产生以下错误:
clang++ --std=c++11 test.cpp test.cpp:22:7: error: call to member function 'func' is ambiguous base.func(1);
用g,会产生警告:
g++ -std=c++11 test.cpp test.cpp: In function ‘int main()’: test.cpp:22:13: warning: ISO C++ says that these are ambiguous,even though the worst conversion for the first is better than the worst conversion for the second: base.func(1);
为什么这个代码不明确?
void func(doublE); // #1 void func(int) const; // #2
也接受一个implicit object parameter,被认为是超负荷决议([over.match]/p1)任何其他争论:
将隐式对象参数并入成员函数签名后,编译器会看到两个重载:
void func(Base&,doublE); // #1 void func(const Base&,int); // #2
并尝试根据呼叫选择最佳可行功能:
Base base; base.func(1);
从base(它是Base的非常量值)到Base&具有完全匹配等级(直接引用绑定产生一个Identity conversion) – 参见Table 13.从base到const Base&也是一个完全匹配的排名,但是,[over.ics.rank]/p3.2.6声明#1有一个更好的转换顺序:
现在对于第二个参数,从积分pr值1到double的转换是浮点积分转换([conv.fpint]),它被赋予转换等级.另一方面,1到int是具有完全匹配等级的身份转换.对于这个参数,#2被认为具有更好的转换顺序([over.ics.rank]/p3.2.2):
过载分辨率成功要求至多存在一个参数,转换序列不同([over.match.best]):
这里,ICS0(#1)优于ICS0(#2),反之,ICS1(#2)优于ICS1(#1),所以编译器不能在两次重载之间进行选择并检测模糊.
以上是大佬教程为你收集整理的c – 为什么这个对成员函数的调用是模糊的?全部内容,希望文章能够帮你解决c – 为什么这个对成员函数的调用是模糊的?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。