변환 연산자의 반환을 const_cast할 수 없는 이유는 무엇입니까?
-
12-09-2019 - |
문제
const 포인터를 반환하는 변환 연산자가 있는데 이를 const_cast해야 합니다.그러나 적어도 MSVC8에서는 작동하지 않습니다.다음 코드는 내 문제를 재현합니다.
class MyClass {
public:
operator const int* () {
return 0;
}
};
int main() {
MyClass obj;
int* myPtr;
// compiles
const int* myConstPtr = obj;
// compiles
myPtr = const_cast<int*>(myConstPtr);
// doesn't compile (C2440: 'const_cast' : cannot convert from 'MyClass' to 'int *')
myPtr = const_cast<int*>(obj);
}
왜 그런 겁니까?반직관적인 것 같습니다.감사해요!
해결책
작동하려면해야합니다.
myPtr = const_cast<int*>(static_cast<const int*>(obj));
const_cast 직접 캐스트되면 컴파일러는 캐스트 연산자가 int*를 찾습니다.
다른 팁
const_cast
유형의 불변성만 변경할 수 있습니다.암시적 연산자를 호출하려면 다음이 필요합니다. static_cast
그리고 나서 const_cast
.짜증나는 일이지만 자신이 하고 있는 일을 명확하게 밝혀줍니다.
myPtr = const_cast<int*>(static_cast<const int*>(obj));
구식 C 스타일 캐스트 연산자를 사용할 수도 있습니다.
myPtr = (int*)(const int*)obj;
그러나 이는 다음과 같은 여러 가지 이유로 매우 권장되지 않습니다.
- 그것은 grepable이 아니다
- 당신은 당신이 의도한 것보다 더 많은 일을 매우 쉽게 할 수 있습니다.대부분의 경우 당신은 엉망이 되고 싶지 않습니다.
const_cast
유형 작업 및 사용static_cast
이를 시행합니다.실제로 당신은 거의 원하지 않습니다const_cast
.정기적으로 이 작업을 수행한다면 몇 가지 설계 실수가 있는 것입니다.
편집하다:조금 어긋나 있었는데 지금은 고쳤습니다.C 스타일 캐스트를 좀 더 추악하게 만듭니다.
const_cast를 사용하여 동일한 유형의 비 초보 포인터 (constness를 캐스트하기 위해)로 변환 할 수 있습니다. 관련없는 유형 사이에 캐스트하려면 ReneterPret_cast가 필요합니다.
에 대해 생각하다 const_cast<>
함수 템플릿으로
template <typename Target, typename Source>
Target const_cast( Source src );
(그것은 그것이 구현되는 방식이 아니라 여기에서 그것을 상상하는 데 도움이됩니다). 그 다음에 Source
그대로 추론됩니다 MyClass
, 그리고 아무것도 없습니다 const_cast
MyClass에서 int*를 얻기 위해 할 수 있습니다.
당신이 원하는 것은 다음 중 하나입니다.
const_cast<int*>( static_cast<const int*>(obj) /* invokes operator const int* */ );
// or
const_cast<int*>( obj.operator const int*() );
아마도 다음과 같은 작업을 수행하면 컴파일러가 더 명확 할 것입니다.
myPtr = const_cast<int*>(obj());
나는 아직 시도하지 않았다고 생각했다.
편집 : 운영자 선언이 다음과 같아서는 안됩니다.
const int* operator () {