2012-09-11 4 views
8

다음 코드가 주어지면 Foo에 복사 생성자가 있습니까? Foo를 STL 컨테이너와 함께 사용하는 것이 안전합니까?템플릿 복사 생성자

class Foo 
{ 
public: 
    Foo() {} 

    template <typename T> 
    Foo(const T&) {} 
}; 

답변

10

표준 명시 복사 생성자가 동일한 유형의 가능성 CONST 휘발성 객체에 대한 참조를 취하는 비 템플릿 생성자 인 것을 말한다. 위의 코드에서 전환이 있지만 사본 인 (즉, 이지만 내재적으로 선언 된 생성자가 사용되는 사본은 사본에 사용됩니다.

Foo에 복사 생성자가 있습니까?

예, 암시 적으로 선언 된/정의 된 사본 생성자입니다.

표준 라이브러리 컨테이너에는 Foo을 사용하는 것이 안전합니까?

그것이 Foo의 최신 정의

하지만, 일반적인 경우에, 그것은 Foo이 무슨 구성원과 암시 적으로 정의 된 복사 생성자가 제대로들을 관리 할 것인지 여부 따라 달라집니다.

+0

템플릿'Foo (const Foo &) = delete; 앞에 선언하면 어떻게됩니까? 클래스에 복사 생성자가 없거나 대신 템플릿이 호출됩니까? – orlp

+1

복사 생성자가 삭제 된 경우 클래스에 복사 생성자가 없습니다. ;-) –

+0

@nightcracker 다음에는 복사 생성자가없고 컴파일러에서 오류가 발생합니다 (예 : 이동 복사 생성자를 사용할 수있는 표현식이없는 경우). 열쇠는 복사 생성자가 * 템플릿이 아닌 *입니다. – juanchopanza

1

Foo에는 제공 한 템플릿 변환 생성자로 대체 할 수없는 컴파일러 생성 복사본 생성자가 있습니다.

Foo f0; 
Foo f1(f0); // calls compiler-synthesized copy constructor 
Foo f2(42); // calls template conversion constructor with T=int 
+0

실제로 복사 생성자를 호출하지 않는 것 같습니다. : //stackoverflow.com/questions/11037644/how-do-i-get-the-copy-constructor-called-over-a-variadic-constructor –

4

표준에 따르면, 복사 생성자는 다음 서명 중 하나 여야합니다

Foo(Foo &); 
Foo(Foo const &); 
Foo(Foo volatile &); 
Foo(Foo const volatile &); 

Foo(Foo&, int = 0,); 
Foo(Foo&, int = 0, float = 1.0); //i.e the rest (after first) of the 
           //parameter(s) must have default values! 

코드에서 템플릿 생성자는 위의 형태와 일치하지 않기 때문에 , 즉 이 아닌복사본 -constructor입니다.

+1

기본 매개 변수도 가질 수 있습니다. – FrozenHeart

+0

@NikitaTrophimov : 네, 그 역시. – Nawaz