1

下面是一个重载赋值运算符的模板类的示例。给定这个类:

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  
4

2 回答 2

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*应该编译你的代码,但你应该避免这样做。

于 2013-01-03T02:24:48.303 回答
1

std::string两个赋值运算符

basic_string& operator=( const CharT* s );
basic_string& operator=( CharT ch )

和 0 可以匹配前者和后者。如何?0 是一个有效的 char,null char,表示指针 NULL 值也是有效的。因此编译器抛出error C2593: 'operator =' is ambiguous.

至于为什么在你的Attribute类案例中接受它,编译器能够使用这个构造函数构造一个 std::string

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

并将其作为rhs您的函数中的传递Type operator=( const Type rhs );这种行为是由于编译器执行的隐式转换。

于 2013-01-03T02:48:59.927 回答