2013-07-06 1 views
-3

내가const가 있거나없는 선언이 같은 이유는 무엇입니까?

T& operator[](int i) const; 
const T& operator[](int i) const; 

어떻게 내가 대신 다른 중 하나를 사용할 수있는 경우? 왜 이들을 정의할까요?

+4

심지어 컴파일합니까?! –

+2

반환 형식은 함수 오버로드에 참여하지 않습니다. 따라서 오버로드로 사용할 수 없습니다. –

답변

3

내가 할 수있을 것 같지 않습니다. 모호합니다. 일반적으로 당신이 원하는 것 :

T& operator[](int i); // note no trailing const 
const T& operator[](int i) const; 

첫 번째 오버로드는 개체가 아닌 const 때 선택 -이 두 번째보다 더 나은 경기를, 그리고 두 번째는 인스턴스가 const 때 선택 - '첫 아무튼 전혀 일치하지 않는다.

1

올바른 쌍은이 (다음과 같은 의미하는 것 같이 내가 귀하의 게시물이 오타가 있다고 생각) : 귀하의 질문에, 내가 그들 모두를 정의 할 수 제안에 관해서는

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 버전을 호출 할 것이다.

관련 문제