了解C ++中的const_cast

时间:2019-06-19 09:50:46

标签: 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_);
}

2 个答案:

答案 0 :(得分:5)

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

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

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

现在,该方法返回对const对象的非常量引用!请注意,该方法本身被声明为const,因此,在该方法的上下文中,thisconst,并且items_也是const。在const test实例上调用该方法时,使用该方法返回的引用将导致未定义的行为。

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

另一方面,在原样的方法中(即返回const引用),没有理由进行强制转换。 items_const,并返回对其的const引用。

const_cast很有用,例如,当您确实确定要抛弃const的对象确实不是真正的对象时,它可以避免const和非const方法的代码重复const,有关详细信息,请参见here

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

答案 1 :(得分:3)

这不是必需的,只需返回_items

const成员函数将对象本身(*this)视为const,因此每个数据成员都被视为const,允许从中构造和返回const引用。

#include <iostream>
using namespace std;
class test {

std::vector<Item> items_;
public:
const std::vector<Item>& getItems() const;
};
const std::vector<mv::Item>& mv::Workloads::getItems() const
{
return items_;
}