2011-04-07 3 views
3

나는 다음과 같은 경우 :C++은 멤버 함수의 특정 const를 호출하도록 보장됩니까?

class A { 
    int foo() const { 
     j++; 
     return i; 
    } 

    int& foo() { 
     return i; 
    } 

    int i; 
    mutable int j; 
}; 

다음 분명히 뭔가

A a; 
a.foo() = 5; 

같이 const가 아닌 버전을 호출합니다. 그러나 조건이 충족 될 필요하면 개체 자체가 const

int i = a.foo(); //I would expect to call the const. Is it guaranteed? 

const int j = a.foo(); //Ditto 

const int& l = a.foo(); //Ditto 

int& k = a.foo(); //I would expect the non-const 
foobar(k); //foobar is "void foobar(int)" 
return; //but the compiler could potentially decide the const version is fine. 
+0

'mutable' = 웩한다. EDIT하지만 이걸 찾았 어. http://stackoverflow.com/questions/105014/c-mutable-keyword – rubenvb

답변

4

const 함수가 호출됩니다 ... 전화가 몇 가지 예에 대한 CONST 또는 const가 아닌 버전으로되어 있는지 확인합니다. 또한

int i = static_cast<const A>(a).foo(); //calls const function 

더 나은 이해를 위해이 코드를 참조하십시오 온라인 데모를 참조하십시오

void f(const A &a) //a is const inside the function 
{ 
    int i = a.foo(); // calls const function 
} 
void h(A &a) //a is non-const inside the function 
{ 
    int i = a.foo(); // calls non-const function 
} 

A a; 
f(a); 
h(a); //pass the same object! 

(는 의견를 읽을 수 있어야합니다) : http://ideone.com/96flE

+0

@GMan : 예. 참된. 수정되었습니다. – Nawaz

+2

나는 캐스트가'static_cast (a)'이어야한다고 생각한다. 그렇지 않으면 정적 캐스트는 const 인 'a'의 사본을 생성하고 그 사본의 멤버를 호출 할 것이다. –

+0

@David하지만 그가 참조로 변환하면 객체 자체는 여전히 비 const가됩니다. 그는 "객체 자체가 const 일 때"라고 말합니다. 따라서 참조 유형에 대한 캐스트는 그의 설명을 정확하게 반영하지 못합니다. –

3

a의 const와 어떤 기능 결정을 - 무엇을 반환 값은 과부하 해결의 일부가 아닙니다. 모든 샘플은 비 const 버전을 호출합니다.

3

어떤 오버로드를 결정할 때 리턴 값은 고려되지 않습니다. 또한

, a

A a; 

으로 선언 한 다음 비 CONST 버전이 우선한다.

a하는 경우는 다음 CONST 버전은 호출 할 수 있습니다

const A a; 

로 선언된다.

+0

템플릿을 사용하여 컴파일러를 속이지 않는 한 :) –

1

멤버 함수 호출이 const 멤버 함수로 해석되는지 여부는 "this"포인터의 constness, 즉 호출 된 멤버 함수에 암시 적으로 전달되는 도트 또는 화살표 연산자의 LHS에있는 객체에 따라 다릅니다.

비 CONST를 해결 :

A a; 
a.foo(); 

는 CONST를 해결 :

void bar(const A& a) 
{ 
    a.foo(); 
} 
관련 문제