在 C++ 中将非 const 转换为 const
Posted
技术标签:
【中文标题】在 C++ 中将非 const 转换为 const【英文标题】:casting non const to const in c++ 【发布时间】:2011-08-16 18:22:36 【问题描述】:我知道您可以使用const_cast
将const
转换为非const
。
但是如果你想将非const
转换为const
,你应该使用什么?
【问题讨论】:
【参考方案1】:const_cast
也可用于添加const
ness 行为。
来自cplusplus.com:
这种类型的铸造操纵 对象的常量性,要么是 设置或删除。
【讨论】:
const_cast
不是cosnt_cast
。无法编辑,因为我必须更改至少 10 个字符:/【参考方案2】:
自 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) );
【讨论】:
【参考方案3】:你不需要const_cast
来添加const
ness:
class C;
C c;
C const& const_c = c;
请通读question and answer了解详情。
【讨论】:
【参考方案4】: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
需要针对用户类类型的特定构造函数。
@Geotarget 你不正确,没有创建新对象,因此可用的构造函数无关紧要。
您不需要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 来表示没有任何可疑的事情发生【参考方案5】:
如果将非 const 参数传递给具有 const 参数的函数,则会进行隐式转换
【讨论】:
【参考方案6】:如果您愿意,可以使用const_cast
,但这并不是真正需要的——非常量可以隐式转换为 const。
【讨论】:
致投反对票的人:既然你显然不打算发表评论,或者试图指出为什么你认为这是错误的或无益的,你能不能至少再投一次毫无根据的投反对票,所以我的代表分数将再次成为 10 的倍数? 从非const
到const
的隐式转换是不可靠的。有时它需要明确。例如,一种方法将区分const
和非const
版本的参数,以便返回reference_wrapper
的vector
或const
ness。例如考虑这个声明: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&);
.以上是关于在 C++ 中将非 const 转换为 const的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 中将“string*”转换为“const string&”?
如何在 C++ 中将 std::string 转换为 const char [重复]
在 C++ 中将右值引用转换为临时参数到 const 左值返回的正确方法