【发布时间】:2015-10-29 23:03:51
【问题描述】:
考虑以下程序,它编译并运行良好:
#include <iostream>
#include <string>
using std::string;
struct BB
{
// generic cast
template<typename T>
operator T() const
{
std::cout<<"Generic cast\n";
return 0;
}
// string cast
operator string() const
{
std::cout<<"string cast\n";
return string("hello");
}
};
int main()
{
BB b;
string s = b; // copy constructor
}
但如果我将main() 函数的代码稍微更改如下:
int main()
{
BB b;
string s;
s = b;
}
编译器给出以下错误信息 (See live demo here)
[Error] ambiguous overload for 'operator=' (operand types are 'std::string {aka std::basic_string<char>}' and 'BB')
为什么这个调用是模棱两可的?这背后的原因是什么?看起来有很多重载的operator=,比如一个用于char,一个用于char*,一个用于const char*,等等。这就是上面的程序使编译器产生歧义。
【问题讨论】:
-
在第一种情况下,这不是调用的赋值运算符,而是一个复制 ctor。但是我认为在第二种情况下,模板转换运算符和字符串转换之间存在歧义。
-
@MaMazav:是的,你是对的。但我的问题是关于 = 运算符出现的第二种情况。
-
在 liveemo 页面上,错误消息还列出了编译器考虑在第二种情况下解决分配的所有候选者
-
@HellmarBecker,这个神奇的“livedemo”页面在哪里?
-
@Gread.And.Powerful.Oz:阅读问题以查看它。
标签: c++ assignment-operator function-call ambiguous-call