2012-08-24 1 views
4
struct S { 
    S() {} 
    S (const S &) = delete; 
}; 

void f1 (S s) {} 
void f2 (S &s) {} 

int main() { 
    S s; 

    f2(s); 
} 

이 삭제됩니다, 왜은 (는) 인수에 전달 선언 때부터 오류가 발생하지 f2를 사용하여 않습니다 S &s? f1(s)을 사용하면 오류가 발생합니다. 삭제 된 함수의 정의를 살펴 봤는데 오류가 발생한다고 생각했지만 그렇지 않습니다. 왜?삭제 된 기능을 사용하는 것이 왜 효과가 있습니까? <code>S(S &s)</code> 이후

답변

9

S 살펴 가지고 있습니다 :

struct S { 
    S() {}     // default constructor 
    S (const S &) = delete; // copy-constructor 
}; 

당신이 여기에있는 것은 건설 할 수있는 타입입니다 만 복사 할 수 없습니다.

지금 당신의 기능을 살펴 보도록 할 수 있습니다 : 당신이 f1(s)를 호출 할 때

void f1 (S s1) {} // creates a local copy of its parameter 
void f2 (S &s2) {} // takes a reference to the parameter 

이 함수는 s의 사본을 만들려고 -하지만 당신의 유형 S 복사를 금지 -이 작동하지 않는 이유가있다. 그래서 당신은 s2으로 f2 안에 무엇 이건 원래 객체 s에 직접 이루어집니다 - 당신이 f2(s)를 호출 할 때

는 함수는 매개 변수에 대한 참조를 만듭니다. 클래스가 다른 사람이 객체를 참조하는 것을 방지 할 수있는 방법은 없습니다.

+0

나를 혼란스럽게하는 것은'S (const S &) = delete'를 볼 때 나는 생각한다 : *''S & s'와 같이''f2 (S & s2)' 나는 그 논리를 이해하지 못한다. – 0x499602D2

+0

네, 어떻게 이것이 혼란 스러울 지 알 수 있습니다. 그러나 생성자 (특히 단일 매개 변수가있는 것)는 _special_이라는 것을 기억해야합니다. – Fiktik

10

참조로 전달하면 복사본이 생성되지 않으므로 (f2이 사용함)

f1은 매개 변수를 사용하여 복사본을 만듭니다.

+0

그래서'S (S & S) = 삭제;는 참조로 전달할 수 없습니까? –

+0

@ user6607 아니요, 참조로 전달하기 때문에 작동합니다. 가치에 의한 전달을 허용하지 않습니다. –

+0

@ LuchianGirgore 좋아,하지만 정확히 그 반대 ... –

관련 문제