2

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

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

4

5 回答 5

4

为了使它工作,你必须做:

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

当您直接进行 const_cast 时,编译器会寻找转换运算符为 int*。

于 2009-07-13T13:31:03.280 回答
2

const_cast只能改变一个类型的常量。如果要调用隐式运算符,则需要 a static_cast,然后是 a 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 风格的演员表有点难看

于 2009-07-13T13:32:50.783 回答
1

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

于 2009-07-13T13:23:15.833 回答
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*() );
于 2009-07-13T13:26:19.870 回答
-1

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

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

我还没试过,心想。

编辑:运营商声明不应该是这样的:

const int* operator () {
于 2009-07-13T13:25:04.863 回答