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

kam*_*lot 48 c++ types casting const constants

我知道你可以const_cast用来投射const到非const.

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

Mot*_*tti 47

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(); 
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 你不需要`const_cast <const Type*>`来添加`const`限定符 - 这样做是10个额外的视觉噪声字符,所以这个练习是IMO的一个坏主意™.只需使用`const foo*= obj;`.`const_cast`最常用于(ab)用来[带`const` away](http://stackoverflow.com/questions/3803521/question-about-const-cast-in-c). (7认同)
  • @Geotarget你是不正确的,没有创建新对象,因此哪些构造函数可用并不重要. (4认同)
  • 你的方法在所有情况下都不起作用......`const_cast`需要一个特定的用户类类型的构造函数. (2认同)
  • 关于人们说`const_cast`的说法对此不好:以这种方式使用`const_cast`在构造函数的成员初始化中是有帮助的,在这里你不能使局部变量添加const.另外,我认为"视觉噪音"有助于明确发现有关常数的异常情况.然而,最好添加一个注释来澄清你是_adding_ const,以确保人们不会本能地抨击邪恶的`const_cast`. (2认同)
  • 只是添加:正如所指出的,添加constness是隐式完成的,因此也可以使用`static_cast <const VarType>(var)`.我个人几乎从不使用const_cast,因为它主要弥补代码中的软件架构缺陷(当用于抛弃constness时).因此,当添加constness时,我使用局部变量方法或static_cast来表示没有任何可疑的事情发生 (2认同)

Oza*_*ray 28

你不需要const_cast添加constness:

class C;
C c;
C const& const_c = c;
Run Code Online (Sandbox Code Playgroud)

请仔细阅读这个问题和答案.


Sco*_*ham 28

自C++ 17以来的STL现在提供std::as_const了这种情况.

请参阅:http://en.cppreference.com/w/cpp/utility/as_const

使用:

CallFunc( as_const(variable) );
Run Code Online (Sandbox Code Playgroud)

代替:

CallFunc( const_cast<const decltype(variable)>(variable) );
Run Code Online (Sandbox Code Playgroud)


Jer*_*fin 5

您可以使用const_castif,但实际上并不需要 - 非const可以隐式转换为const.

  • 对于那些做过downvote的人:因为你显然不会发表评论,或者试图指出你认为这是错误或无益的原因,你至少可以做一次无根据的下注,所以我的代表得分将是10的倍数再次? (6认同)
  • 从非`constst`到`c​​onst`的隐式转换是不可靠的.有时它需要明确.例如,一个方法可以区分参数的`const`和非`constst`版本,以便返回`const`ness的`reference_wrapper`的`vector`.例如考虑这个声明:`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&);`. (6认同)