2010-12-08 10 views
6

私はこの「オブジェクトがコピーコンストラクタに値として渡される可能性がありますか」 コンパイラはこれを明確に拒否します。 これを理解するのを手伝ってもらえますか?オブジェクトをコピーコンストラクタに値として渡すことができます

class Dummy{ 
    Dummy(Dummy dummy){ // This is not possible 
    } 
}; 

次に、「値渡しが使用されると、コンストラクタが再帰呼び出しにつながる」と言われているのはなぜですか。

+0

@Kos - 私は同意しません。人々は*正しい*答えを受け入れるべきであり、彼らの好みではありません。 –

+0

良い点! :-)それは "あなたの好きな正解"を読んだはずです。 – Kos

+2

私は正解であると判断する専門家はいません。しかし、私にとって魅力的なのは正しいと思われるものでしょう。 – Zuzu

答えて

12

この値を渡すためには、COPYオブジェクトが必要です。したがって、コピーする方法の定義で、オブジェクトのコピーを渡しています。

実際にこのトラップが存在しない場合は、コピーコンストラクタがコピーコンストラクタを呼び出してコピーを作成し、コピーコンストラクタを呼び出してコピーを作成し、コピーコンストラクタを呼び出してコピーを作成します、...

+0

しかし、コンパイラーは、Ctorのパラメーターとして値渡しを許可していないようで、COPYingが画像に入ります。まだこれを得ることはできません。 – Zuzu

+1

@Zuzu:そのため、パラメータを値で指定するコピーコンストラクタを使用できないため、この無限再帰のために呼び出すことはできません。 –

+1

@Zuzu:*許された場合、* then *再帰があります。その仮説の再帰を防ぐために、それは禁止されています。 –

5

エラーが言うように、それはコピーコンストラクタの再帰呼び出しにつながります。コピーコンストラクタは、オブジェクトのコピーに使用されます。値渡しのときにオブジェクトのコピーを作成する必要があります。

そのようなコンストラクタを使用できる場合は、コピーコンストラクタに渡すオブジェクトをad infinitumにコピーするためにコピーコンストラクタを呼び出す必要があります。

4

パラメータがvalueで指定されている場合、コンパイラは最初にオブジェクトをコピーする必要があります(引数になるインスタンスを作成するには)。したがって、コピーコンストラクタを呼び出すには、コンパイラは事前にオブジェクトのコピーを作成する必要があります。

は通常、コピーコンストラクタは、このような方法で定義されています

Dummy(const Dummy& dummy) 
{ 
    // This is possible 
} 

この方法では、あなたがコンストラクタのオブジェクトの別のコピーを要求していない、あなただけの既存のコピーへの参照を与えます(そしてそのコピーも変更しないことを約束します)。

1

次に、「値渡しを使用すると、コンストラクタが再帰呼び出しにつながる」と言われているのはなぜですか?

オブジェクトをそのコピーコンストラクタに値で渡すために、渡された元のオブジェクトの一時コピーであるため、最初にコピーを作成する必要があります。

5

標準具体(12.1/10コンストラクタ)言う:

クラスXのコピーコンストラクタは、タイプX &のまたはタイプCONSTの最初のパラメータを持つコンストラクタであるX &は

したがって、値パラメータを取ることはできません。これは参照でなければなりません。

なぜか分かりますか?なぜなら、値パラメータを渡すには、コンパイラがコピーを作成しなければならないということです。コピーコンストラクタを呼び出す必要があります。

+0

例をもってわかりますか? – Zuzu

+0

orangeoctopusの回答の例は、理解を深めるのに役立つかもしれません。 –

1

すでに回答がありましたが、同じ質問が繰り返されているので、私は明確にしたかっただけです。 Dummy(Dummy dummy);はコピーコンストラクタではありません。コピーコンストラクタは、Dummy(const Dummy&);またはDummy(Dummy&);のいずれかの形式にすることができます。オリジナルのものは、この規格では明らかに禁止されています。

次に、あなたが求めている:

を、なぜそれがと言われて、「値渡しを使用する場合はコピー コンストラクタは再帰呼び出し につながります。」

診断メッセージは標準ではなく、むしろコンパイラがその理由を説明するために選択したものです。

関連する問題