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

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

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

【问题讨论】:

    标签: c++ types casting constants


    【解决方案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;);.
          猜你喜欢
          • 2011-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-14
          • 1970-01-01
          • 2015-08-05
          • 1970-01-01
          相关资源
          最近更新 更多