在 C++ 中将非 const 转换为 const

Posted

技术标签:

【中文标题】在 C++ 中将非 const 转换为 const【英文标题】:casting non const to const in c++ 【发布时间】:2011-08-16 18:22:36 【问题描述】:

我知道您可以使用const_castconst 转换为非const

但是如果你想将非const 转换为const,你应该使用什么?

【问题讨论】:

【参考方案1】:

const_cast 也可用于添加constness 行为。

来自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来添加constness:

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&lt;const Type*&gt; 来添加const 限定符——这样做会增加10 多个额外的视觉噪音字符,因此这种做法是IMO 一个坏主意™。只需使用const foo* = obj;const_cast 最常(ab)用于take const away。 作为关于人们说const_cast 对此不好的注释:以这种方式使用const_cast 有助于构造函数的成员初始化,您不能在其中创建局部变量来添加 const .此外,我认为“视觉噪音”有助于使人们清楚地看到关于 const-ness 正在发生一些不寻常的事情。但是,最好添加注释以澄清您正在添加 const,以确保人们不会本能地抨击邪恶的const_cast 只是添加:正如所指出的,添加常量是隐式完成的,因此也可以使用static_cast&lt;const VarType&gt;(var)。我个人几乎从不使用 const_cast,因为它主要弥补了代码中的软件架构缺陷(当用于抛弃 constness 时)。因此,当添加 constness 时,我使用局部变量方法或 static_cast 来表示没有任何可疑的事情发生【参考方案5】:

如果将非 const 参数传递给具有 const 参数的函数,则会进行隐式转换

【讨论】:

【参考方案6】:

如果您愿意,可以使用const_cast,但这并不是真正需要的——非常量可以隐式转换为 const。

【讨论】:

致投反对票的人:既然你显然不打算发表评论,或者试图指出为什么你认为这是错误的或无益的,你能不能至少再投一次毫无根据的投反对票,所以我的代表分数将再次成为 10 的倍数? 从非constconst 的隐式转换是不可靠的。有时它需要明确。例如,一种方法将区分const 和非const 版本的参数,以便返回reference_wrappervectorconstness。例如考虑这个声明:template&lt;typename Image&gt; vector&lt;reference_wrapper&lt;typename conditional&lt;is_const&lt;Image&gt;::value, const typename Image::celltype, typename Image::celltype&gt;::type&gt;&gt; get_subimage(int, int, Image&amp;);.

以上是关于在 C++ 中将非 const 转换为 const的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将字符串转换为 const char[]

如何在 C++ 中将“string*”转换为“const string&”?

如何在 C++ 中将 std::string 转换为 const char [重复]

在 C++ 中将右值引用转换为临时参数到 const 左值返回的正确方法

在 C++ 11 中将非 const 左值引用绑定到右值是不是有效?(修改)

为啥在 Rust 中将 const 引用直接转换为可变引用无效?