다음 스 니펫을 고려하십시오.str :: map :: find() const 오버로드
#include <map>
class C {
public:
C() {}
const int& f(const int& x) const
{
// Error: cannot cast const int* to int* const
return myMap.find(&x)->second;
// With a const_cast works:
//return myMap.find(const_cast<int* const>(&x))->second;
}
std::map<int*, int> myMap;
};
int _tmain(int argc, _TCHAR* argv[])
{
int x = 0;
C c;
c.f(x);
return 0;
}
f()
의 오류는 const KeyType&
를 취하는 맵의 find()
의 const 과부하로 인해 발생합니다. 지도의 주요 유형이 int*
이므로 int* const
로 바뀝니다. f()
는 매개 변수가 수정되지 않으므로 const int&
매개 변수를 사용합니다.
불행하게도 이것은 const int*
을 int* const
로 형 변환하려고 시도하는데 결국 int* const
은 int에 대한 const 한정자를 잃어 버리고 컴파일되지 않습니다.
매개 변수가 확실히 수정되지 않았기 때문에 일종의 짜증나는 일입니다. find()와 같이 사용되었지만 const_cast
가 필요합니다.
const_cast
없이 f()
을 쓸 수있는 방법이 있습니까?
이것은 다소 드문 경우입니다. 왜 포인터를 맵 키로 사용하고 있습니까? –
내 응용 프로그램에서는 키가 중량 객체에 대한 참조가되어야하며 참조를 맵 키로 사용할 수 없습니다. – AshleysBrain