1

私はテンプレート プログラミングに関する本を読んでいます。その例の 1 つに、テンプレート化された代入演算子で自己チェックを行うコードがあります。基本的には次のようなものです。

template <typename T>
class Foo
{
public:

    template <typename O>
    Foo<T> operator= (const Foo<O> & other)
    {
        if ((void *)this == (void *)&other)
        {
            std::cerr << "success" << std::endl;
        }
        else
        {
            std::cerr << "failure" << std::endl;
        }
        return *this
    }
};

私の理解では、テンプレート化された代入演算子はデフォルトの代入演算子の生成を妨げないため、O = T の場合、テンプレート化されたバージョンでは常にデフォルトの代入演算子が選択されます。つまり、この状況では、O = T になることはありません。

私が疑問に思っているのは、これについての私の理解が正しいかどうかです。もしそうなら、代入演算子が「成功」を出力するある種のトリッキーな階層(Fooを他の何かから派生させた場合、またはそれが他の何かから派生させた場合など)がありますか?

私はいくつかのことを試しましたが、実際にはそれを行うことができません。

前もって感謝します

4

1 に答える 1

0

あなたが正しいか、MSVC 11 と g++ 4.7.1 の両方が間違っています。

つまり、通常、テンプレート化された代入演算子は呼び出されません。自動生成されたコピー代入演算子が呼び出されます。

「成功」を出力するには、次のようにして、コンパイラが空の基本クラスの最適化 (EBO) を使用することを望みます。

#include <iostream>

template <typename T>
class Foo;

template<> class Foo<void> {};

template <typename T>
class Foo: public Foo< void >
{
public:

    template <typename O>
    void operator=( const Foo<O> & other )
    {
        if ((void *)this == (void *)&other)
        {
            std::cerr << "success" << std::endl;
        }
        else
        {
            std::cerr << "failure" << std::endl;
        }
    }
};

int main()
{
    Foo<int> a, b;

    Foo<void>& v = a;
    a = v;
}
于 2012-10-04T15:05:50.353 に答える