覆盖模板类上的赋值运算符时的奇怪行为

时间:2013-01-03 02:22:42

标签: c++ templates variable-assignment operator-keyword

下面是一个模板类的示例,它重载赋值运算符。鉴于此课程:

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  

2 个答案:

答案 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::stringtwo 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

构造一个std :: string

basic_string( const CharT* s, const Allocator& alloc = Allocator() );

并将其作为函数rhs中的Type operator=( const Type rhs )传递;这种行为是因为编译器的implicit conversion