내가const가 있거나없는 선언이 같은 이유는 무엇입니까?
T& operator[](int i) const;
const T& operator[](int i) const;
어떻게 내가 대신 다른 중 하나를 사용할 수있는 경우? 왜 이들을 정의할까요?
내가const가 있거나없는 선언이 같은 이유는 무엇입니까?
T& operator[](int i) const;
const T& operator[](int i) const;
어떻게 내가 대신 다른 중 하나를 사용할 수있는 경우? 왜 이들을 정의할까요?
내가 할 수있을 것 같지 않습니다. 모호합니다. 일반적으로 당신이 원하는 것 :
T& operator[](int i); // note no trailing const
const T& operator[](int i) const;
첫 번째 오버로드는 개체가 아닌 const
때 선택 -이 두 번째보다 더 나은 경기를, 그리고 두 번째는 인스턴스가 const
때 선택 - '첫 아무튼 전혀 일치하지 않는다.
올바른 쌍은이 (다음과 같은 의미하는 것 같이 내가 귀하의 게시물이 오타가 있다고 생각) : 귀하의 질문에, 내가 그들 모두를 정의 할 수 제안에 관해서는
T& operator[](int i); //without const;
const T& operator[](int i) const;
당신 때문에 코드에서 둘 다 사용하게 될 수도 있습니다. 한 가지 예가 있습니다. a
그것이 비 CONST 버전을 호출 할 수있는 수단 CONST 개체이기 때문에이 코드
void f(X const &a, X & b)
{
int i = get_index();
std::cout << a[i] << std::endl; //this invokes const version
std::cout << b[i] << std::endl; //this invokes non-const version
}
,
a[i]
는
operator[]
CONST의 버전을 호출한다. 그러나
b[i]
의 경우 C++ 규칙은
b
오브젝트가 비 const이고
operator[]
의 비 const 오버로드가 있기 때문에 비 const 버전을 호출해야한다고 명시되어 있습니다. 도움이
b[i] = item; //it must invoke non-const version in order
//to compile and work (properly).
희망 : const가 아닌 과부하가없는 경우에도 b[i]
이 같은 색인 i
에 데이터를 기록하고자 할 때 많은 경우에 바람직하지 않다 CONST 버전을 호출 할 것이다.
심지어 컴파일합니까?! –
반환 형식은 함수 오버로드에 참여하지 않습니다. 따라서 오버로드로 사용할 수 없습니다. –