2014-09-14 2 views
0

인수가 값으로 전달되지 않는 이유는 무엇입니까?참조에 의해 인수가 전달되는 이유는 무엇입니까?

시도해 보았을 때 컴파일러에서 "아마도 Foo(const Foo&)을 의미합니다."라는 메시지를 전했습니다.

왜 그럴까요?

+1

실제로 값을 전달하면 컴파일러가 ypuir varibale의 복사본을 만들어야하므로 복사 생성자를 호출하십시오. 결과로 사본을 만들려면 사본을 만들어야하지만 사본을 만들려면 사본을 만들어야합니다. – Lol4t0

+0

우리는 비슷한 질문을 여기에있다 http://stackoverflow.com/questions/13413419/parametized-constructor-not-an-copy-one – Athiruban

+3

@ 40two 무한 재귀를 피하기 위해 주로 – juanchopanza

답변

7

값으로 전달하려면 먼저 복사 생성자가 필요합니다.

따라서 무한 재귀를 피하기 위해, 값 복사 전달을 실제로 원할 경우 참조 복사 생성자에 의한 전달은 값 전달 버전보다 먼저 정의되어야합니다. 값으로 복사 생성자를 갖는 것은별로 의미가 없기 때문에 표준에서는이를 금지합니다.

+0

그래서 .. 가치가 필요하지 않을까요 (다시)? –

+0

@prodicus 사실. 따라서 이것을 피하기 위해서는 먼저 다른 버전을 정의해야합니다. – WiSaGaN

+0

"가치 버전으로 전달"을 할 수 없습니다. –

5

당신은 단순히 값으로 전달할 수 없습니다 - 표준의 §12.8 [class.copy]/P6 명시 적으로 금지 :

클래스 X의 생성자의 선언은 잘못 형성된다 첫 번째 매개 변수의 형식이 (선택적으로 cv 한정) X이고 인 경우 다른 매개 변수가 없거나 다른 모든 매개 변수는 기본 인수가 있습니다. 멤버 함수 템플릿은 결코 생성자 서명을 생성하는 으로 인스턴스화되지 않습니다.

주석에 설명 된대로이 금지의 이유는 무한 재귀입니다. "복사본을 만들려면 복사본을 만들어야합니다"라는 말이 적합하지 않습니다.

관련 문제