2012-02-02 12 views
0

列挙型を含む構造体の暗黙のコピーコンストラクタがでない理由はではconstのバージョンを使用するか、またはコピーコンストラクタがまったくないのはなぜですか?私はつまり、作成される暗黙のコピーコンストラクタを期待:列挙型の構造体のC++コピーコンストラクタのシグニチャ

X(const X& x) 

私はメンバ変数は、コピーコンストラクタを持っていない場合、これは例えば、起こるかもしれないときのためのルール、または非constコピーがある知っていますコンストラクタ。私は私の質問は、これが列挙型にどのように関連しているのかと思います。

私自身のコピーコンストラクタを追加することは機能しているようです。

例 - コピーコンストラクタが暗黙的に作成しているものがあれば、:

struct MyStruct { 
    int myInt; 
    double myDouble; 
    MyEnum myEnum; 
}; 
+2

いつからC++がコピーコンストラクタを合成できないのですか?メンバーの1つがコピーできない場合、自動コピーコンストラクタは生成されず、ストーリーの終わりになります。 –

+2

コピーコンストラクタがこのシグネチャを持っていることをどのように知っているかを説明できますか? 'int main(){const X x1;}を実行します。 X2(x1); } 'うまくいきませんか? –

+1

問題を示す具体的な例を挙げてください。 – HighCommander4

答えて

1

あなたの推測は間違っています。問題はどこか他の場所です。次のコードは、明示的にコピーコンストラクタが定義されていない場合は問題なくコンパイルされ、コンストラクタが非const参照をとる場合はコンパイルに失敗します。

#include <iostream> 
#include <iterator> 
#include <vector> 

enum MyEnum { 
    e0, e1, e2 
}; 

struct MyStruct { 
    int myInt; 
    double myDouble; 
    MyEnum myEnum; 
    // MyStruct(MyStruct&){} // uncomment to make compilation fail 
}; 

std::ostream& operator<<(std::ostream& out, const MyStruct& s) { 
    out<<"{"<<s.myInt<<","<<s.myDouble<<","<<s.myEnum<<"}"; 
    return out; 
} 

int main() { 
    MyStruct s = {42, 3.1415926, e0}; 
    MyStruct s1 = s; 
    std::vector<MyStruct> v(10, s1); 
    std::copy(v.begin(), v.end(), std::ostream_iterator<MyStruct>(std::cout,"\n")); 
    return 0; 
} 

他の人がコメントで指摘したように、誤りを証明する現実的な例は、本当の問題は何を理解することが必要です。

+0

あなたは正しいです。問題はコードの他の部分です。私の問題は、私はそれにアクセスすることができないということです。面白い(?)のことは、私自身のコピーコンストラクタを実装し、 'push_back'を呼び出すと決して返されないということです。私はメモリやスレッドの問題をどこかで推測します。私がもちろんコンストラクタを台無しにしていない場合は:-) – Magnus

0

これは私の専門知識のうち少しです。

Xのconstではない左辺のインスタンスからXを構築しようとすると、X(X&)というシグネチャはより近い一致となり、選択されます。

+4

しかし、両方のフォームが宣言されている場合にのみ、両方のフォームが宣言されます。 –