Рассмотрим следующую программу она компилируется и работает нормально:Почему эта операция присваивания приводит к неоднозначному вызову функции?
#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
@MaMazav: да, вы правы. Но мой вопрос касается второго случая, когда = оператор входит в картину. – Destructor
На странице liveemo в сообщении об ошибке также перечислены все кандидаты, рассмотренные компилятором для решения задания во втором случае –