为什么我不能const_cast返回转换运算符?

时间:2009-07-13 13:15:20

标签: c++ const-cast

我有一个返回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);
}

为什么?这似乎违反直觉。谢谢!

5 个答案:

答案 0 :(得分:4)

要使其发挥作用,您必须这样做:

myPtr = const_cast<int*>(static_cast<const int*>(obj));

直接使用const_cast时,编译器会将转换运算符查找为int *。

答案 1 :(得分:2)

const_cast只能更改类型的常量。如果要调用隐式运算符,则需要static_cast,然后const_cast。虽然它很烦人,但它确保你明确你在做什么。

myPtr = const_cast<int*>(static_cast<const int*>(obj));

您还可以使用旧学校的C风格演员

myPtr = (int*)(const int*)obj;

但出于以下几个原因,这是非常沮丧的:

  • 这不是格言
  • 您可以轻松地完成比预期更多的工作。大多数情况下,您不希望混淆const_cast类型的操作并使用static_cast强制执行此操作。事实上,你很少想要const_cast。如果你发现自己经常这样做,你会遇到一些设计错误。

编辑:我稍微偏了,我现在修好了。这使得c式演员变得更加丑陋

答案 2 :(得分:1)

你只能使用const_cast转换为相同类型的非const指针(抛弃constness)。要在不相关的类型之间进行转换,您需要reinterpret_cast。

答案 3 :(得分:1)

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*() );

答案 4 :(得分:-1)

如果您执行以下操作,您的编译器可能会更清楚:

myPtr = const_cast<int*>(obj());

我还没有尝试过,想过。

编辑: 操作员声明不应该像:

const int* operator () {