20

template copy-con はデフォルトのコピーコンストラクターではなく、 template assignment-op は決してコピー代入演算子ではないことを読みました。

この制限が必要な理由を理解できず、すぐにオンラインで ideone に接続してテスト プログラムを返しましたが、ここではコピー コンストラクターがさらにグーグルで呼び出されることはありません。

#include <iostream>
using namespace std;

template <typename T> class tt
{
    public :
    tt()
    {
        std::cout << std::endl << "   CONSTRUCTOR" << std::endl;
    }
    template <typename U> const tt<T>& operator=(const tt<U>& that){std::cout << std::endl << "   OPERATOR" << std::endl;}
    template <typename U> tt(const tt<U>& that)
    {
        std::cout << std::endl << "    COPY CONSTRUCTOR" << std::endl;
    }
};


tt<int> test(void)
{
    std::cout << std::endl << "      INSIDE " << std::endl; tt<int> a; return a;
}

int main() {
    // your code goes here
    tt<int> a ; a = test();

    return 0;
}

この制限を設定する理由と、テンプレート クラスのコピー コンストラクターを作成する方法を誰かが説明してくれませんか。

ありがとう

4

2 に答える 2

25

コピー コンストラクターを構成する厳密な規則があります (cf. C++11、12.8)。

  • テンプレートではありません。

  • クラスの場合、最初の引数の型はorまたはorTでなければなりません。T &T const &T volatile &T const volatile &

  • 複数の引数がある場合、それ以降の引数にはデフォルト値が必要です。

コピー コンストラクターを宣言しない場合は、フォームのコピー コンストラクターT::T(T const &)暗黙的に宣言されます。(実際には定義されている場合と定義されていない場合があり、定義されている場合は削除済みとして定義される場合があります。)

(通常のオーバーロード解決規則は、CV 修飾ごとに 1 つずつ、最大 4 つのコピー コンストラクターを持つことができることを意味します。)

&&ムーブ コンストラクターには、代わりにを使用した類似の規則があります&

于 2013-10-03T19:12:25.533 に答える
25

なぜそうなのかについてコメントすることはできませんが、クラス テンプレートのコピー コンストラクターと代入演算子を記述する方法は次のとおりです。

    template <class T>
    class A
    {
      public:
        A(const A &){}
        A & operator=(const A& a){return *this;}
    };

以上です。
ここでの秘訣Aは、 がテンプレートであっても、クラス内でA(関数シグネチャなどで) 参照すると、完全な型として扱われることですA<T>

于 2013-10-03T19:12:56.290 に答える