在C++中将非常量转换为常量

75

我知道你可以使用const_cast将一个const转换为非const

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

6个回答

63

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(); 
    }
};

2
你的方法并不适用于所有情况... const_cast 需要用户类类型的特定构造函数。 - Robin Rodricks
4
@Geotarget,你是错误的,没有创建新的对象,因此可用的构造函数无关紧要。 - Motti
8
在添加const限定符时,您不需要使用const_cast<const Type*>,这样做会增加10多个字符的视觉噪音,因此我认为这种做法是一个糟糕的想法™。只需使用const foo* = obj;即可。const_cast最常被(滥)用于去除const限定符。 - bobobobo
3
关于那些说“const_cast”不好的人的一点说明:在构造函数成员初始化中使用const_cast是有帮助的,因为您无法创建本地变量来添加const。此外,我认为“视觉干扰”有助于表明与常量性有关的异常情况。然而,最好添加注释以澄清你正在“添加”const,以确保人们不会本能地抨击邪恶的“const_cast”。 - Aberrant
2
只是补充一下:如指出的那样,添加const属性是隐式完成的,因此也可以使用static_cast<const VarType>(var)。我个人几乎从不使用const_cast,因为它大多数时候弥补了代码中的软件架构缺陷(当用于去除const属性时)。因此,在添加const属性时,我要么使用本地变量方法,要么使用static_cast来表示没有任何可疑的事情发生。 - Florian Tischler

50

31

你不需要使用const_cast来增加const的特性:

class C;
C c;
C const& const_c = c;

请阅读这个问题和答案以获取详细信息。


7

如果你想要的话,你可以使用const_cast,但这并不是必须的——非常量可以隐式转换为常量。


9
给那位点了踩的人:既然你显然不打算发表评论或指出为什么你认为这是错误或无用的,那么你能否再多点一次毫无根据的踩,这样我的声望分数就能再次成为10的倍数? - Jerry Coffin
9
从非constconst的隐式转换是不可靠的。有时需要显式转换。例如,一个方法需要区分参数的const和非const版本,以便返回具有不同const性质的vectorreference_wrapper。考虑例如这个声明: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&); - kccqzy

3

const_cast可以用于添加const特性。

来自cplusplus.com

这种类型的转换可以操作一个对象的常量性,无论是设置还是移除。


3
const_cast 不是 cosnt_cast。无法编辑,因为我至少需要更改10个字符 :/ (注:正确的拼写应为 const_cast 而非 cosnt_cast) - mozzbozz

2
如果您将非const参数传递给具有const参数的函数,则会发生隐式转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接