【发布时间】:2011-08-16 18:22:36
【问题描述】:
我知道您可以使用const_cast 将const 转换为非const。
但是如果你想将非const 转换为const,你应该使用什么?
【问题讨论】:
标签: c++ types casting constants
我知道您可以使用const_cast 将const 转换为非const。
但是如果你想将非const 转换为const,你应该使用什么?
【问题讨论】:
标签: c++ types casting constants
【讨论】:
const_cast 不是cosnt_cast。无法编辑,因为我必须更改至少 10 个字符:/
自 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 可用于删除 或 向对象添加常量。当您想要调用特定的重载时,这会很有用。
人为的例子:
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();
}
};
【讨论】:
const_cast 需要针对用户类类型的特定构造函数。
const_cast<const Type*> 来添加const 限定符——这样做会增加10 多个额外的视觉噪音字符,因此这种做法是IMO 一个坏主意™。只需使用const foo* = obj;。 const_cast 最常(ab)用于take const away。
const_cast 对此不好的注释:以这种方式使用const_cast 有助于构造函数的成员初始化,您不能在其中创建局部变量来添加 const .此外,我认为“视觉噪音”有助于使人们清楚地看到关于 const-ness 正在发生一些不寻常的事情。但是,最好添加注释以澄清您正在添加 const,以确保人们不会本能地抨击邪恶的const_cast。
static_cast<const VarType>(var)。我个人几乎从不使用 const_cast,因为它主要弥补了代码中的软件架构缺陷(当用于抛弃 constness 时)。因此,当添加 constness 时,我使用局部变量方法或 static_cast 来表示没有任何可疑的事情发生
如果将非 const 参数传递给具有 const 参数的函数,则会进行隐式转换
【讨论】:
如果您愿意,可以使用const_cast,但这并不是真正需要的——非常量可以隐式转换为 const。
【讨论】:
const 到const 的隐式转换是不可靠的。有时它需要明确。例如,一种方法将区分const 和非const 版本的参数,以便返回reference_wrapper 的vector 或constness。例如考虑这个声明: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&);.