2012-02-02 2 views
0

열거 형을 포함하는 구조체의 암시 적 복사본 생성자가 이 아닌 버전을 사용하는 이유는 무엇입니까? 아니면 복사 생성자가 전혀없는 이유는 무엇입니까? 나는, 암시 적 복사 생성자가 생성되는 기대 예 :enum을 사용하여 struct를위한 C++ 복사 생성자의 서명

내가 멤버 변수는 복사 생성자, 또는 const가 아닌 사본이없는 경우이 예를 들어, 발생할 수있는 경우에 대한 규칙이 알고
X(const X& x) 

건설자. 내 질문에 이것이 열거 형과 어떻게 관련되어 있는지, 그리고 그것이 적용되는이 규칙일까요?

내 복사 생성자를 추가하는 것이 효과가있는 것 같습니다.

예 - 복사 생성자가 암시 적으로 만들어 무엇을 (있는 경우) :

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

언제부터 C++이 복사 생성자를 합성 할 수 있습니까? 멤버 중 하나를 복사 할 수없는 경우 자동 복사 생성자가 생성되지 않고 스토리가 끝납니다. –

+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가 아닌 lvalue 인스턴스에서 X을 만들려고하면 X(X&)이 더 가깝게 선택되어 선택됩니다.

+4

그러나 두 가지 양식이 모두 선언 된 경우에만 발생하며 두 양식이 모두 사용자가 선언 한 경우에만 발생할 수 있습니다. –

관련 문제