다음 코드가 주어지면 Foo에 복사 생성자가 있습니까? Foo를 STL 컨테이너와 함께 사용하는 것이 안전합니까?템플릿 복사 생성자
class Foo
{
public:
Foo() {}
template <typename T>
Foo(const T&) {}
};
다음 코드가 주어지면 Foo에 복사 생성자가 있습니까? Foo를 STL 컨테이너와 함께 사용하는 것이 안전합니까?템플릿 복사 생성자
class Foo
{
public:
Foo() {}
template <typename T>
Foo(const T&) {}
};
표준 명시 복사 생성자가 동일한 유형의 가능성 CONST 휘발성 객체에 대한 참조를 취하는 비 템플릿 생성자 인 것을 말한다. 위의 코드에서 전환이 있지만 사본 인 (즉, 이지만 내재적으로 선언 된 생성자가 사용되는 사본은 사본에 사용됩니다.
Foo
에 복사 생성자가 있습니까?
예, 암시 적으로 선언 된/정의 된 사본 생성자입니다.
그것이표준 라이브러리 컨테이너에는
Foo
을 사용하는 것이 안전합니까?
Foo
의 최신 정의 하지만, 일반적인 경우에, 그것은 Foo
이 무슨 구성원과 암시 적으로 정의 된 복사 생성자가 제대로들을 관리 할 것인지 여부 따라 달라집니다.
Foo
에는 제공 한 템플릿 변환 생성자로 대체 할 수없는 컴파일러 생성 복사본 생성자가 있습니다.
Foo f0;
Foo f1(f0); // calls compiler-synthesized copy constructor
Foo f2(42); // calls template conversion constructor with T=int
실제로 복사 생성자를 호출하지 않는 것 같습니다. : //stackoverflow.com/questions/11037644/how-do-i-get-the-copy-constructor-called-over-a-variadic-constructor –
표준에 따르면, 복사 생성자는 다음 서명 중 하나 여야합니다
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입니다.
기본 매개 변수도 가질 수 있습니다. – FrozenHeart
@NikitaTrophimov : 네, 그 역시. – Nawaz
템플릿'Foo (const Foo &) = delete; 앞에 선언하면 어떻게됩니까? 클래스에 복사 생성자가 없거나 대신 템플릿이 호출됩니까? – orlp
복사 생성자가 삭제 된 경우 클래스에 복사 생성자가 없습니다. ;-) –
@nightcracker 다음에는 복사 생성자가없고 컴파일러에서 오류가 발생합니다 (예 : 이동 복사 생성자를 사용할 수있는 표현식이없는 경우). 열쇠는 복사 생성자가 * 템플릿이 아닌 *입니다. – juanchopanza