2012-06-13 4 views
7

(예 : 다음과 같은) 템플릿 생성자는 암시 적 복사 생성자를 무시합니까? 그렇다면 other이 일정 기준보다 오히려 값에 의해 전달되는 경우는 템플릿 생성자는 C++에서 암시 적 복사 생성자를 무시합니까?

template <class T> 
struct Foo 
{ 
    T data; 

    // ... 

    template <class U> 
    Foo(const Foo<U> &other) : data((T)doSomethingWith(other.data)) {} 

    // ... 
}; 

, 여전히 그것을 무시합니까? 그렇다면

, 명시 적으로 복사 생성자를 정의하지 않고이 주변에 어떤 방법은 무엇입니까?

답변

7

아니, 그건 복사 생성자가 아닙니다. 첫 번째 매개 변수 유형 X&, const X&, volatile X& 또는 const volatile X&의 경우 클래스 X에 대한

비 템플릿 생성자 복사 생성자, 그리고 중 하나를 다른이 없습니다 : 표준의 12.8 절 ([class.copy])을해야합니다 매개 변수 또는 다른 모든 매개 변수는 기본 인수를가집니다.

컴파일러는 여전히 암시 적으로 채무 불이행을 생성합니다.

당신은 명시 적

Foo(const Foo<T>&) = default; 
2

에 의해 (C++ 11 필요) 것을 할 수 않는 템플릿 생성자 (예 : 다음) 암시 적 복사 생성자를 오버라이드 (override)?

아니요. 복사 생성자는 여전히 암시 적으로 선언되며 템플릿보다 우선 선택됩니다.

명시 적으로 복사 생성자를 정의하지 않고이 문제를 해결할 방법이 있습니까?

아니요. 암시 적 복사본 생성자를 원하지 않으면 직접 정의해야합니다.

2

템플릿 화처럼 보이는 템플릿 생성 자나 대입 연산자 [기본 생성자/복사 생성자/이동 생성자/할당 연산자/이동 할당 연산자 복사] 하지 정말 A [기본 생성자/복사 생성자/이동 생성자/복사 대입 연산자/대입 대입 연산자]를 대체 할 수 없으며이를 대체하거나 암시 적으로 생성되지 않습니다.

+0

아이디어가 맞지만 작성한 내용이 잘못되었습니다. "복사 생성자가 ...하지 않을 것입니다"라는 뜻입니까? 그건 거짓말이야. "템플릿 복사 생성자가 ...하지 않을 것입니다"라는 뜻입니까? 그와 같은 일은 없다. –

+0

@BenVoigt 나는 이전에 분명하다고 생각 했었지만 더 정확한 결과를 얻으려고 노력했다. 그러나 지금은 더 혼란 스럽다고 생각한다. – David

관련 문제