2009-08-19 2 views
6

나는 일반적으로 생성 된 기본 할당 연산자와 다른 서명이있는 자신의 대입 연산자, 정의 경우C++ 기본 할당 연산자는 언제 사용할 수 없게됩니까?

struct B; 
struct A { 
void operator = (const B& b) { 
    // assign something 
} 
}; 

이 경우 operator = (A&)에 기본 할당 연산자를 수행 (등을 잘못 경우, 정정 해줘) 정의되지 않거나 액세스 할 수 없게됩니까?

AFAIK 이것은 다른 생성자를 정의하면 존재하지 않는 기본 생성자에 해당합니다. 그러나 이것이 다른 "마법"기본값의 경우인지 정말로 확신 할 수 없습니다.

내가 묻는 이유 : 기본 복사 생성자가 암시 적 유형 변환을 통해 실수로 호출되지 않도록하고 싶습니다. 그것이 존재하지 않는다면 결코 일어날 수 없습니다.

답변

12

호 12.8/9 클래스 X에 대한 할당 연산자가 & 휘발성 또는 & 휘발성 X의 CONST 타입 X, X &의 매개 변수와 비 정적, 비 템플릿, X의 CONST &, X해야 말한다. 그리고 템플릿의 인스턴스화가 암시 적 선언을 억제하지 않는다는 것을 강조하는 주석이 있습니다.

+0

표준 참조 주셔서 감사합니다! 실제로 제 예제보다 더 많은 것을 말합니다. – xtofl

+0

당신 말이 맞아요. 나는 내 대답을 지울거야. –

+0

@Neil, 당신은 use = default가 무엇 일지 궁금해했습니다. 하나는 사용할 수있는 것을 명시 적으로 표현하고, 다른 하나는 액세스 가능성을 변경하는 것이고, 세 번째는 클래스의 진화가 그것을 깨뜨리지 않고 구현을 인라인하지 못하게하는 것입니다. 또 다른 정당성은 기능이 할당보다 더 넓고 기능을 사용하지 않아도 예외를 만들 수있는 인센티브가 없다는 것입니다. – AProgrammer

4

A& operator=(const A&)의 부호가없는 A& operator=(B&)은 합성 된 할당 연산자에 아무런 영향을주지 않습니다.

예를 들어 증명으로 간주되는 한 this snippet at codepad.org을 살펴보십시오.

시험 주행 시험 Comeau와 함께 A& operator=(const A&)이 합성되었음을 보여줍니다.

+0

매우 흥미로운 예입니다. 나는 기본 복사 할당 연산자를 private으로 만들 것이다. – hirschhornsalz

1

AFAIK 이것은 다른 생성자를 정의하면 존재하지 않는 기본 생성자에 해당합니다. 그러나 이것이 다른 "마술"기본값의 경우인지 나는 정말로 확신하지 못한다.

다른 생성자의 규정에 의해 영향을받지 않습니다 기본 복사 생성자 ...

물어 이유 : 나는 기본 복사 생성자가 실수로 암시 적 형태를 통해 호출되는 것을 피하려고 변환. 그것이 존재하지 않는다면 결코 일어날 수 없습니다.

... 또는 할당 연산자. 예를 들면 다음과 같습니다.

class A { 
      private: 
      A& operator= (const A& a); // private here means: forbidden operator 
      public: 
      A(int i) {} 
    }; 

    int main() { 
      A a(2); 
      A b(a);   // copy constructor syntax 1 
      A c = a;  // copy constructor syntax 2 
      // Forbidden: A d; 
      // Forbidden: c = a; 
    } 

기본 복사 생성자를 사용하지 않으려면이를 선언하십시오 (물론 구현할 필요가 없습니다). 유스 케이스와 관련하여 자동 유형 변환을 억제하기 위해 키워드 "explicit"을 살펴볼 수도 있습니다.

관련 문제