我想了解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)
这不仅是不必要的,而且在那个地方显然是错误的。
考虑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,因此this是const在这种方法的情况下,也items_就是const。当在const test实例上调用该方法时,使用该方法返回的引用将导致未定义的行为。
从这个意义上讲,const_cast如果您决定更改返回类型,那么here 的唯一作用是可能使重要的编译器错误静音。
另一方面,按原样(即返回const引用)的方法,没有理由进行转换。items_是,const并const返回对其的引用。
const_cast如果您确实确定要抛弃的对象实际上不是,则可以避免重复代码const和非const方法,这const很有用const,请参见此处以了解详细信息。
PS:如果您确实确实想从const方法中返回对成员的可变引用,则可以声明member mutable。同样也不const_cast需要。虽然,mutable应该谨慎使用,通常一开始就不需要。