참조 연산자 (operator*
)에 과부하가 걸린 경우 멤버 선택 연산자 (operator->
)가 오버로드 된 연산자를 사용합니까 아니면 과부하가 필요합니까?과부하 된 참조 연산자가있는 멤버 선택
3
A
답변
4
화살표 연산자를 별도로 오버로드해야합니다. 보다 일반적으로, C++의 관련 연산자간에 좋은 매핑이 있어도 한 연산자를 오버로드하면 나머지는 "무료"로 오버로드되고 직접 구현해야합니다.
이 수신기 객체에 대한 참조를 얻을 수this
를 역 참조하여 작동
T* Class::operator ->() const {
return &**this;
}
, 그럼 다음의 주소를 가지고, 그 operator *
를 호출하기 위해 역 참조 : 말했다
Boost.Operators 라이브러리를 살펴보면 소수의 기본 작업 집합에서 논리적으로 관련된 많은 연산자를 자동으로 정의 할 수 있습니다.
희망의 도움이되었습니다.
0
본질적으로 오버로드 된 역 참조 연산자를 구현할 수 있지만 오버로드 된 연산자가 작동하려면 두 번 참조해야합니다. 클래스 X
포인터 "E1
이 유형이있는 경우"
0
5.2.5은 "다음 식 E1->E2
은 해당 양식을 (*(E1)).E2
로 변환됩니다." 문제는 해당 경우에 E1
이 이 아니고 포인터가 인 것입니다.
관련 문제
- 1. 과부하 참조 연산자
- 2. 과부하 참조 변환
- 3. 멤버 함수에 대한 참조?
- 4. 초기화되지 않은 참조 멤버
- 5. 과부하
- 6. 중첩 된 위치 연산자가있는 MongoDb의 $ addToSet
- 7. C++ 멤버 선택 사업자
- 8. 과부하
- 9. 과부하 []
- 10. 연산자가있는 호기심 반복 템플릿
- 11. MySQL 중첩 된 선택 테이블 외부 참조?
- 12. xpath 참조 된 XML 노드 선택
- 13. 참조 된 하위 프로젝트의 빌드 구성 선택
- 14. 비교 연산자가있는 DynamoDB 쿼리
- 15. 특정 연산자가있는 concat 문자열
- 16. *, /, +, - 이외의 연산자가있는 RPN
- 17. 비교 연산자가있는 Combobox
- 18. 논리 연산자가있는 JavaScript 스위치?
- 19. 연산자가있는 함수 템플릿
- 20. 과부하 연산자 = 비회원으로
- 21. 클래스 멤버 참조 변수에는 내장 된 "const-correctness"가 있습니까?
- 22. 휘발성 과부하?
- 23. 산술 연산자가있는 Versant OQL 문
- 24. CakePHP 과부하?
- 25. 과부하 방법
- 26. 과부하 방법은
- 27. 오버로드 된 멤버 함수에 대한 멤버 함수 포인터
- 28. 부울이 아닌 연산자가있는 부울의 동작
- 29. MySQL 비교 연산자가있는 하위 쿼리
- 30. 템플릿이있는 클래스의 멤버 구현이있는 정의되지 않은 참조
그래서 실제로 연산자 ->?의 "기본 구현"은 없습니다. – Paranaix
@ Paranaix- 아니요, 불행히도 아닙니다. 일반적으로 오버로드 된 연산자의 기본 구현은 없습니다 (할당 연산자 제외). 다른 관련 연산자에서 해당 연산자를 구현할 수있는 합리적인 방법이있는 경우에도 마찬가지입니다. – templatetypedef
물론 'operator->': return * (this-> operator->());'의 관점에서 단항 연산자'operator * '를 쉽게 구현할 수 있습니다. C++은 어느 쪽을 다른 쪽에서 구현해야하는지 말하지 않거나, 어느 쪽을했는지 보면서 다른쪽에 대한 기본값을 제공하기를 귀찮게합니다. 다른 연산자들과 마찬가지로 연산자를 하나 이상의 방법으로 사용할 수 있습니다 : 연산자 - = 연산자, 또는 단항 연산자 - 연산자와 연산자 + 연산자를 사용합니다. C++은 "기본 작업"이 무엇인지 말해주지 않으며 자신이 생각하는 것을 해결하려고하지 않습니다. 도움이되지 않는다면 일관성이 있습니다. –