2013-06-05 3 views
0

템플릿 배열 클래스를 구현하는 할당이 있습니다. 요구 사항 중 하나는 [] 연산자를 오버로드하는 것입니다. 나는이 2 개의 const와 non-const 버전을 만들었다. 비 const를 배열에배열 연산자 [] const 및 non-const 버전 오버로드

int i=arr[1] 

:

const T& operator[](const unsigned int index)const 

T& operator[](const unsigned int index) 

내 질문은 컴파일러가 내가 좋아하는 일을 할 때 를 실행하는 하나의 알 어떻게?

+0

그렇지 않으면 비 'const' 버전하는'const' 개체에'const' 버전을 호출 할 수 있습니다 :

난 그냥, 당신이 도움이 될 수있는 다른 일 비슷한 질문을 대답했다. –

+0

나는 당신이 정교하게 말한 것을 당신이 의미 한 바를 이해하지 못했습니까? – petric

+0

'arr'이 const이면 const 버전이 호출됩니다. –

답변

6

비 const 함수는 항상 비 const 배열에서 호출되며 const 함수는 const 배열에서 호출됩니다.

같은 이름을 가진 두 개의 메소드가있는 경우 컴파일러는 인수의 유형과 암시 적 객체 매개 변수 (arr)의 유형에 따라 가장 적합한 것을 선택합니다. https://stackoverflow.com/a/16922652/2387403

+0

정말 고맙습니다. – petric

1

모두 개체에 대한 선언에 따라 다릅니다. 당신이 그런 다음 CONST 버전이 호출됩니다

const T arr[]; 
... 
int i=arr[1]; 

을 가지고 있지만 경우

T arr[]; 
... 
int i=arr[1]; 

이있는 경우 그 다음 const가 아닌 버전이 호출됩니다. 그래서 당신이 준 예제에서는 non-const 배열이기 때문에 non-const 버전이 호출 될 것입니다.

+0

컴파일러가 const가 아닌 버전을 단순히 호출하는 것을 선호합니까? 그 이유는 무엇입니까? – petric

+0

@petric 예, 가능합니다. 왜 당신이 함수를 호출 할 때마다 const 버전을 기본값으로 사용한다면 어떤 일이 일어날 지 상상해보십시오. 무엇이든 할 수 없으며 호출되지 않기 때문에 함수의 비 const 버전을 갖는 것이 중요하지 않습니다. –

+0

네, 고맙습니다. – petric