1

我正在阅读 C++ 中的 const_cast 运算符

1.我无法理解的第一件事是

const_cast 运算符语法,即

-const_cast--<--Type-->--(--expression--)--------------------><

我对这种语法的理解是它有助于抛弃expression类型的Type常量。但是考虑一下这段代码

class  ConstTest {   

private:
    int year;
public:
    ConstTest() : year(2007) {}
    void  printYear() const;
};

int main() {
    ConstTest c;
    c.printYear();
    return  0;
}

void ConstTest::printYear() const {
    ConstTest  *c  = const_cast<ConstTest*>(this);
    c->year  = 42;
    std::cout  <<  "This  is the  year "  << year  << std::endl;
}

在 line 中ConstTest *c = const_cast<ConstTest*>(this),我认为this指针的 const 应该被丢弃,但输出显示它是 this引用的对象失去了它的 const-ness。

我觉得代码应该是ConstTest *c = const_cast<ConstTest>(*this),但这会产生错误。我知道我在很多解释上都错了。请全部纠正。

2.我的第二个问题是下面给出的陈述

const_cast 表达式的结果是一个右值,除非 Type 是一个引用类型。在这种情况下,结果是一个左值。

为什么会这样,为什么在指针的情况下它不是真的?

4

1 回答 1

4

它有助于抛弃 Type 类型表达式的常量

不,Type是结果的类型,而不是操作数的类型。

我认为这个指针的 const 应该被抛弃

this有类型const ConstTest*const_cast<ConstTest*>(this)有类型ConstTest*。这就是从指向 const 的指针中“抛弃 const”的意思。

我觉得代码应该是ConstTest *c = const_cast<ConstTest>(*this)

结果的const_cast<T>类型为 T,这就是它的定义方式。也许你会以不同的方式定义它,但运气不好,你不是ConstTest*通过写作const_cast<ConstTest>得到的,而是通过写作得到的const_cast<ConstTest*>。您的首选语法不可用。

你可以做ConstTest &c = const_cast<ConstTest&>(*this)ConstTest *c = const_cast<ConstTest*>(this),所以选择你最喜欢的。

const_cast 表达式的结果是一个右值,除非 Type 是一个引用类型。在这种情况下,结果是一个左值。

为什么是这样,为什么在指针的情况下它不是真的?

指针也是如此。ConstTest*不是引用类型,结果const_cast<ConstTest*>(this)是右值。然后将该值分配给变量c

于 2012-02-03T17:00:05.613 回答