2014-11-15 4 views
8

를 삭제 될 수 할이유는 참조 형식 멤버가 암시 적으로 선언 복사 할당 연산자가 <a href="http://en.cppreference.com/w/cpp/language/as_operator" rel="noreferrer">CPP Reference:</a>에서

삭제 된 클래스 T의 암시 적 선언 또는 디폴트 복사 할당 연산자가 정의 된 암시 적으로 선언 복사 할당 연산자 삭제 다음 중 하나에 해당 지역 :

T has a non-static data member that is const 
T has a non-static data member of a reference type. 
T has a non-static data member that cannot be copy-assigned (has deleted, inaccessible, or ambiguous copy assignment operator) 
T has direct or virtual base class that cannot be copy-assigned (has deleted, inaccessible, or ambiguous move assignment operator) 
T has a user-declared move constructor 
T has a user-declared move assignment operator 

은 그래서 삭제를 야기 아닌 이유는 무엇인지 알려줍니다?

T has a non-static data member of a reference type. 

이 있는지 여부

삭제 된 연산자를 다루는 내 수업에 충분합니다 : 사람에 대해 설명 할 수

T& T:operator=(T& t){}; 

을 내가 참조 형식 인 기본 클래스의 멤버가있는 경우.

명시 적으로 return *this을 선언하거나 내게 컴파일러 (g ++)가이를 처리하도록 할 것과 같은 내 operator=에 무엇인가해야합니까? 참조 회원과 특별한 관계가 있어야합니까? 죄송합니다 멍청한 질문에 대한하지만 C + +를 처음으로 관리 언어 (C# 및 Java) 시작했다.

답변

10

참조는 초기화 될 때 개체에 바인딩되므로 이후에는 변경할 수 없습니다. 참조는 참조 자체가 아니라 바인딩 된 개체에 영향을줍니다.

따라서 참조 멤버는 생성 중에 설정되며 변경되지 않습니다. 대입 연산자의 목적은 구성 후 멤버를 변경하는 것이므로 멤버 중 하나가 절대로 변경 될 수없는 경우 암시 적 대입 연산자를 생성하는 것은 의미가 없습니다. 컴파일러는 여러분이 원하는 것을 시도하고 추측하기를 거부하고 여러분이 원하는 의미론을 자신의 할당 연산자에 제공하도록 강요합니다.

반환 값 * this를 명시 적으로 선언하거나 컴파일러 (g ++)가 이것을 처리합니까?함수가 void 또는 main()에 (이 암시 return 0; 당신이 도달 할 경우 반환하는 경우

당신이 절대적으로 확실히 100 % 필요 return *this;

에 당신이 C++에서 명시 적으로 수익을 필요로하지 않는 유일한 시간이다 함수의 끝) 또는 절대 반환하지 않는 함수 (예 : 반복적으로 또는 예외를 throw하는 함수)와 같은 비정상적인 경우에 사용됩니다.

참조 회원에게 특별한 조치를 취해야합니까?

유형의 할당에 어떤 의미가 있을지 예상됩니다.

참조가 바인딩 된 객체를 변경하지 않으려면 아무 것도하지 마십시오.

참조가 바인딩 된 개체를 지정하여 할당하려면 해당 작업을 수행해야합니다.

참조를 다른 객체에 다시 바인딩하려면 운이 없어요. C++에서는 허용하지 않습니다.

+0

좋은 답변 - 당신도 반환 *을 덮어 로이 하나를 선택했습니다. 나는 C++을 즐기고 있지만 혼란에 빠지기 쉽다는 것을 알 수 있습니다. – Luthervd

5

참조는 변경할 수 없습니다. 참조에 의해 참조되는 객체는 변경할 수 있지만 참조 자체는 변경할 수 없습니다.

고려

struct A { 
    int &r; 
    A(int &r_) : r(r_) { } 
}; 

int main() { 
    int i, j; 
    A a1(i), a2(j); 
    a1 = a2; 
} 

이 당신이 가능 a1.rj을 참조 할 것 사용자 정의 operator= 구현 할 수아무것도 없으며, 더 operator=이 생성되지 가져 오거나 여러분을 대신하여 작성해야합니다 그 이유는.

operator=이 해당 참조를 변경하지 않아도 괜찮다면 직접 정의 할 수 있습니다.

참조를 변경하려면 operator=이 필요한 상황 인 경우 클래스에 참조를 사용하면 안됩니다. 포인터가 더 적절할 수 있습니다.

+1

불량 컴파일러. 그것은이 질문과는 아무런 관련이 없지만, 아무 말도하지 않은 것들에 대해 항상 뒤죽박죽이되었습니다. –

+0

@KerrekSB Heh. 컴파일러가 표준을 따르는 경우를 제외하고는 컴파일러가'operator = '를 생성해서는 안되며 문서에서 다르게 명시된 경우를 제외하고는 불필요하게 자세하게 표시한다고 생각합니다. :) – hvd

+0

정확 하 게. 당신은 "표준이 말하는 것"에서 멈출 수있었습니다. –

관련 문제