我正试图了解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_);
}
答案 0 :(得分:5)
这不仅是不必要的,而且在那个地方完全是错误的。
考虑从返回类型中删除const
时会发生什么:
/*const*/ std::vector<mv::Item>& mv::Workloads::getItems() const
{
return const_cast<std::vector<Item>&>(items_);
}
现在,该方法返回对const
对象的非常量引用!请注意,该方法本身被声明为const
,因此,在该方法的上下文中,this
是const
,并且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_;
}