잘못된 것을 돌려 보내면 의도하지 않은 부작용이 발생한다고 걱정되면 operator=()
을 작성하여 void
으로 보낼 수 있습니다. 나는 이것을 수행하는 코드를 보아왔다. (나는 게으름을 추측하거나 리턴 타입이 '안전'보다 무엇인지 알지 못한다.) 그것은 거의 문제를 일으키지 않는다. 일반적으로 operator=()
이 반환하는 참조를 사용해야하는 표현식은 거의 사용되지 않으며 거의 항상 쉬운 코드가 대신 사용됩니다.
void
을 돌려 줄 것이라고 확신하지는 않습니다 (코드 검토에서 내가하지 말아야 할 일이라고 생각합니다).하지만 고려해야 할 옵션으로 던지고 있습니다. 당신은 할당 연산자의 이상한 사용이 어떻게 처리 될지 걱정할 필요가 없다.
후반 편집 : 또한
, 내가 원래 당신이 당신을함으로써 그 차이를 분할 할 수 있음을 언급해야한다는 operator=()
돌려 const&
- 아직 할당 체인 허용됩니다
a = b = c;
그러나 좀 더 특이한 용도를 허용하지 않습니다.
(a = b) = c;
이것은 대입 연산자가 C에있는 것과 유사한 의미를 가지며, 연산자 =
에 의해 반환 된 값은 lvalue가 아닙니다. C++에서 표준이 바뀌어 =
연산자가 왼쪽 피연산자 형식을 반환하므로 lvalue가되지만 스티브 제시록 (Steve Jessop)이 다른 답변에 주석에서 언급했듯이 컴파일러가 받아 들일 수 있도록 컴파일러가 받아들이도록했습니다.
(a = b) = c;
심지어 내장형 인 경우 a
이 중간 점 시퀀스 포인트없이 두 번 수정되므로 내장형에 대한 정의되지 않은 동작이 발생합니다. 이 문제는 operator=()
함수 호출이 시퀀스 포인트이기 때문에 operator=()
이있는 내장되지 않은 호출에서는 피할 수 있습니다.
사람들이 표현식이 아닌 성명서를 다루기를 원하면 'void'를 반환 할 수 있습니다. 그것은'(a = b) = c','a = (b = c)'와 값과 참조의 차이를 드러내는 다른 속임수를 멈출 것이다. –
오브젝트가 스택에서 벗어 났을 때 오브젝트가 자동으로 삭제되는 것을 막아야 할 때 할당 연산자에서 void를 리턴하는 것이 유용하다는 것을 알게되었습니다. 참조 카운트 된 객체의 경우 소멸자가 모르는 사이에 소멸자가 호출되는 것을 원하지 않습니다. – cjcurrie