2015-10-01 14 views
15

は、次のプログラムを考えてみましょう:コピーコンストラクタの楕円の意味は何ですか?

#include <iostream> 
struct Test 
{ 
    int a; 
    Test() : a(3) 
    { } 
    Test(const Test& t...) 
    { 
     std::cout<<"Copy constructor called\n"; 
     a=t.a; 
    } 
    int get_a() 
    { 
     return a; 
    } 
    ~Test() 
    { 
     std::cout<<"Destructor is called\n"; 
    } 
}; 
int main() 
{ 
    Test t; 
    Test* t1=new Test(t); 
    std::cout<<t.get_a()<<'\n'; 
    std::cout<<t1->get_a()<<'\n'; 
    delete t1; 
} 

は密接に私はこのプログラムをしようとしたとき、私は本当に驚いたコピーコンストラクタ のパラメータに3個のドットを観察します。それの使用は何ですか?どういう意味ですか?

言語仕様にはこれについての記載がありますか?

は、私は3つのドットが printf()scanf()などともC99で導入さ可変引数マクロのように可変引数関数で可変長引数を表すために使用されていることを知っています。 C++では、私が間違っていなければ、バリデーショナルなテンプレートで使われます。
このコードは適切に構成されていますか?任意の数の引数を取ることができるこの可変コピーコンストラクタですか?

それがg ++ 4.8.1 & MSVS上&実行罰金コンパイル2010

+6

'(カンマに注意) –

+1

型自体の値と呼ばれ、参照することによってそれを取ることができる任意のコンストラクタは、可能なコピーコンストラクタです。任意のさらなる議論が供給され得るという事実は重要ではない。 –

+4

@PiotrSkotnicki:だから、カンマが必要ないのはなぜですか? – Destructor

答えて

5

セクションのドラフト標準8.3.5[dcl.fct], ...は抽象宣言子の一部である......ない限りと同義であると言います( 強調鉱山):

[...]パラメータ宣言句は省略記号 か楽しみで終了した場合(14.5.3)の場合、引数の数は がデフォルト引数の を持たないパラメータの数以上でなければならず、関数のパラメータパックでもありません。 構文的に正しいと「...」、 抽象宣言子の一部ではない「...」「...」と同義である。[...]

ので、それは[class.copy]セクション12.8から、私の知る限り、これはまた、有効なコピーコンストラクタで追加の引数なしで言うことができるようにvariadic functionです:

クラスXのための非テンプレートコンストラクタはコピーでありますその の最初のパラメータがtyの場合はコンストラクタconst X &、const X &、volatile X &またはconst volatile X &であり、その他のパラメータがないか、その他のすべてのパラメータにデフォルトの引数(8.3.6)があります。

とこのノートは楕円がパラメータではないことを言う:

言うそれを超えると規範的なテキストによってバックアップされている
void g(int = 0, ...); // OK, ellipsis is not a parameter so it can follow 
         // a parameter with a default argument 

:パラメータ宣言した場合

- 節は省略記号で終わる[...]それは抽象宣言子を頼まれたので、

注意、識別子のない宣言子です。

+0

私が引用した最初のルールは、[有名な6つのドット]を許可するものです(http://stackoverflow.com/a/33502576/1708801)。 –

5

どのような用途ですか?どういう意味ですか?

はい、バリデーション機能を導入しています。

C++で私が間違っていない場合は、バリデーションテンプレートで使用されます。

構文とセマンティクスが異なります。これは可変的なものではなく、 "Cスタイル"の可変機能ですテンプレートの機能です。さらに、コピーコンストラクタはテンプレート関数にすることはできません。その 最初のパラメータがCONST X &、揮発性X &又はX & CONST揮発性 、いずれか、タイプX &である場合、クラスXのため

非鋳型コンストラクタはコピーコンストラクタあります他のすべてのパラメータが存在しないか、他のすべてのパラメータ にデフォルトの引数(8.3.6)があります。

最終草案(強調鉱山)で§12.8.2パー

このコードも形成されますか?任意の数の引数を取ることができるこの可変コピーコンストラクタですか?

省略記号にパラメータが含まれている場合、それはもはやコピーコンストラクタではなく、単純なコンストラクタです。存在しない場合は、有効なコピーコンストラクタです。 `テスト(CONSTテスト&T、...)と同じ

X(const X&, int = 1, double = 5); // copy-ctor 
X(const X&, int = 1, double); // constructor 
+0

このリンクのプログラムは、デフォルトの引数を使用しないので、コピーコンストラクタを持たないと言うことができます。 http://ideone.com/VuNTU5 – Destructor

+1

@PravasiMeet Right。 – edmz