변환 연산자의 반환을 const_cast할 수 없는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1119375

  •  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 () {
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top