了解C ++中的const_cast

bla*_*eep 1 c++ casting

我想了解const_cast

在下面的示例中,items_是一个私有成员变量。

方法getItems()是一种const方法,这意味着它不能修改成员变量items_

getItems()返回一个const vector引用,这意味着您不能修改成员变量items_

我的问题是,const_cast在这里有必要吗?我不这样认为,因为我不需要放弃常数性?

#include <iostream>

class test {  
  std::vector<Item> items_;
public:
  const std::vector<Item>& getItems() const;
};

const std::vector<mv::Item>& mv::Workloads::getItems() const
{
  return const_cast<std::vector<Item>&>(items_);
}
Run Code Online (Sandbox Code Playgroud)

for*_*818 5

这不仅是不必要的,而且在那个地方显然是错误的。

考虑const从返回类型中删除时会发生什么:

/*const*/ std::vector<mv::Item>& mv::Workloads::getItems() const
{
return const_cast<std::vector<Item>&>(items_);
}
Run Code Online (Sandbox Code Playgroud)

现在,该方法返回对const对象的非常量引用!注意,这个方法本身所申报的const,因此thisconst在这种方法的情况下,也items_就是const。当在const test实例上调用该方法时,使用该方法返回的引用将导致未定义的行为。

从这个意义上讲,const_cast如果您决定更改返回类型,那么here 的唯一作用是可能使重要的编译器错误静音。

另一方面,按原样(即返回const引用)的方法,没有理由进行转换。items_是,constconst返回对其的引用。

const_cast如果您确实确定要抛弃的对象实际上不是,则可以避免重复代码const和非const方法,这const很有用const,请参见此处以了解详细信息。

PS:如果您确实确实想从const方法中返回对成员的可变引用,则可以声明member mutable。同样也不const_cast需要。虽然,mutable应该谨慎使用,通常一开始就不需要。