下面是一个模板类的示例,它重载赋值运算符。鉴于此课程:
template<class Type>
class Attribute
{
public:
Type operator=( const Type rhs )
{
mData = rhs;
return mData;
}
private:
Type mData;
};
为什么下面的代码编译没有任何错误?
Attribute<std::string> str;
str = 0;
虽然看似矛盾,但这段代码:
std::string test;
test = 0;
产生以下错误?
error C2593: 'operator =' is ambiguous
答案 0 :(得分:2)
std::string
重载operator=,您的代码编译很好但在执行字符串构造函数时有不确定的行为,因为它不接受NULL(感谢Potatoswatter)
basic_string& operator=( const CharT* s );
注意:str = 0;
等于
std::string str = std::string(NULL);
std::string test;
test = 0;
这里,编译器不能推导出0
是char类型或指针,因此下面两个运算符重载是不明确的:
basic_string& operator=( const CharT* s );
basic_string& operator=( CharT ch );
手动将0
转换为char或char*
应该使代码编译,但是你应该避免这样做。
答案 1 :(得分:1)
std::string
有two assignment operators
basic_string& operator=( const CharT* s );
basic_string& operator=( CharT ch )
和0可以匹配前者和后者。怎么样? 0是有效的char the null char,它也有效表示指针NULL值。因此编译器会抛出error C2593: 'operator =' is ambiguous
。
至于为什么在Attribute
类的情况下接受它,编译器能够使用this constructor
basic_string( const CharT* s, const Allocator& alloc = Allocator() );
并将其作为函数rhs
中的Type operator=( const Type rhs )
传递;这种行为是因为编译器的implicit conversion。