const_cast的行为

时间:2012-02-03 16:53:01

标签: c++ casting lvalue rvalue

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

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

const_cast运算符语法,即

  
    

-const_cast - &LT; - 类型 - &GT; - ( - 表达 - )--------------------&GT;&LT; < / p>   

我对此语法的理解是,它有助于抛弃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;
}

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

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

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

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

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

1 个答案:

答案 0 :(得分:4)

  

它有助于抛弃Type

类型的表达式的constness

不,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表达式的结果是rvalue,除非Type是a   参考类型。在这种情况下,结果是左值。

     

为什么如此以及为什么在指针的情况下它不是真的?

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