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型またはポインタを差し引くことができないため、以下の2つの演算子のオーバーロードであいまいになります。

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

手動で0charにキャストするかchar*、コードをコンパイルする必要がありますが、それは避けてください。

于 2013-01-03T02:24:48.303 に答える
1

std::string2つの代入演算子があります

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

0は、前者と後者の両方に一致します。どのように?0は有効な文字であり、null文字です。また、ポインタの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 に答える