2013-10-03 10 views
14

私はそのテンプレートを読んでいますcopy-conはデフォルトのcopy onstructorではなく、template assignment-opは決してコピー代入演算子ではありません。テンプレートクラスのコンストラクタをコピーします

なぜこの制限が必要なのかわかりませんでした。すぐにideoneにオンラインになり、test programを返しましたが、ここでコピーコンストラクタが呼び出されることはありません。私はtemplatizedコンストラクタを見つけました。 。

#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; 
} 

この制限の背後にある理由とテンプレートクラスのコピーコンストラクタを書く方法についての説明がありますか?

おかげ

+2

[コピー - 抽出](http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) – 0x499602D2

+1

「デフォルトのコピーコンストラクタ」はありません。 *コピーコンストラクタは1つしかありません。テンプレートは決してそれではありません。 –

+0

コードを編集してideoneで実行しましたが、まだコピーコンストラクタが呼び出されません。しかし、私はこの制限の背後にある理由を理解することもできません – anonymous

答えて

18

厳格な規則は、コピーコンストラクタ(参照:C++ 11、12.8)を構成するものがあります

  • それはテンプレートではありません。クラスTについては

  • 、その最初の引数は、型T &またはT const &またはT volatile &またはT const volatile &を持っている必要があります。

  • 引数が複数ある場合は、それ以上の引数にはデフォルト値が必要です。あなたはコピーコンストラクタを宣言しない場合、フォームT::T(T const &)のコピーコンストラクタがある

は、暗黙のうちにあなたのためのを宣言しました。

(通常のオーバーロードの解決規則は、最大4つのコピーコンストラクタを持つことができ、CV認定ごとに1つずつ作成することができることを意味します(実際に定義されている場合と定義されていない場合があります) 。

&の代わりに、&&という移動コンストラクタにも同様の規則があります。

17

私は、これはそれがどのようであるが、ここであなたは、クラステンプレートのコピーコンストラクタと代入演算子を書き込む方法です理由についてコメントすることはできません。

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

と、それはそれです。
Aがテンプレートであるにもかかわらず、クラス内でA(関数シグニチャなど)と参照すると、フルタイプA<T>として扱われます。

+1

A(const A &){}を使用するとエラーは発生しません... – Daniel

+4

@Danielそれは 'A ' 'A'はクラスの中で使うことができます。 – SirGuy

+0

@ニコライナイタここの最初のコメントは何を言っているのではないですか? – SirGuy

関連する問題