我知道你可以使用const_cast
将一个const
转换为非const
。
但是如果你想把非const
转换为const
,应该使用什么?
const_cast
可以用于删除或添加对象的常量性。这在你想调用特定重载时非常有用。
举个假例:
class foo {
int i;
public:
foo(int i) : i(i) { }
int bar() const {
return i;
}
int bar() { // not const
i++;
return const_cast<const foo*>(this)->bar();
}
};
自C++17起,STL提供了std::as_const
来处理这种情况。
参见:http://en.cppreference.com/w/cpp/utility/as_const
用法:
CallFunc( as_const(variable) );
改为:
CallFunc( const_cast<const decltype(variable)>(variable) );
如果你想要的话,你可以使用const_cast
,但这并不是必须的——非常量可以隐式转换为常量。
const
到const
的隐式转换是不可靠的。有时需要显式转换。例如,一个方法需要区分参数的const
和非const
版本,以便返回具有不同const
性质的vector
的reference_wrapper
。考虑例如这个声明:template<typename Image> vector<reference_wrapper<typename conditional<is_const<Image>::value, const typename Image::celltype, typename Image::celltype>::type>> get_subimage(int, int, Image&);
。 - kccqzyconst_cast
不是 cosnt_cast
。无法编辑,因为我至少需要更改10个字符 :/ (注:正确的拼写应为 const_cast 而非 cosnt_cast) - mozzbozz
const_cast
需要用户类类型的特定构造函数。 - Robin Rodricksconst
限定符时,您不需要使用const_cast<const Type*>
,这样做会增加10多个字符的视觉噪音,因此我认为这种做法是一个糟糕的想法™。只需使用const foo* = obj;
即可。const_cast
最常被(滥)用于去除const
限定符。 - bobobobostatic_cast<const VarType>(var)
。我个人几乎从不使用const_cast,因为它大多数时候弥补了代码中的软件架构缺陷(当用于去除const属性时)。因此,在添加const属性时,我要么使用本地变量方法,要么使用static_cast来表示没有任何可疑的事情发生。 - Florian Tischler