당신은 이제 다음과 같은 의미가
Hugo a;
Hugo b = a; // forbidden
Hugo c(a); // allowed
Hugo d = HugoCopy(a); // allowed
Hugo f() {
Hugo a;
return a; // forbidden
return HugoCopy(a); // allowed
}
또는 적용되는 다음
class HugoCopy;
class Hugo {
public:
Hugo() { ... }
Hugo(HugoCopy const&);
explicit Hugo(Hugo const&) { ... }
};
struct HugoCopy {
HugoCopy(Hugo const& hugo)
:hugo(hugo)
{ }
Hugo const& hugo;
};
Hugo::Hugo(HugoCopy const&) { ... }
같은 명시 적 HugoCopy
클래스를함으로써이 문제를 해결할 수 있습니다, 당신은 변환 기능을 사용할 수 있습니다
class Hugo {
public:
Hugo() { ... }
explicit Hugo(Hugo const&) { ... }
};
struct HugoCopy {
HugoCopy(Hugo const& hugo)
:hugo(hugo)
{ }
operator Hugo const&() { return hugo; }
private:
Hugo const& hugo;
};
이것은 C++ 언어의 미묘한 구석에 달려 있습니다. ge. 그래서 당신이 이것을 사용한다면, 당신은 당신이하고있는 일을 잘 알고 있거나하지 말아야합니다. 먼저 HugoCopy의 변환 함수 (또는 첫 번째 경우에는 Hugo
의 생성자)를 호출하여 Hugo
/Hugo const&
이되고, 직접Hugo
개체를 가진 대상 Hugo
개체를 초기화합니다. GCC는 코드를 좋아하지 않지만, Clang과 Comeau/EDG는 위의 의미에 따라 그것을 받아 들인다.
코드의 현재 상태는 어떻습니까? – Puppy
어떤 종류의 오류가 있습니까? – jwueller
복사 생성자가 명시적인 이유는 무엇입니까? 그리고 "왜 복사 생성자를 명시 적으로 원하지만 암시 적 복사본을 수행하기를 원합니다"라고 말하는 이유는 무엇입니까? 생성자를 명시 적으로 만드는 모든 점은 암시 적 변환을 방지하는 것이지만 복사 생성자는 실제로 "변환"하지 않습니다. 초기화, 인수 전달 등을 지원하기위한 것입니다. –