C++ const_cast的合法用途是什么
在C++ const_cast的合法用途是什么,c++,constants,C++,Constants,在const\u cast的帮助下,如果有人要修改我声明的常量对象,那么const限定符有什么用 我的意思是,有人如何确保他所声明的const不会被修改?const\u cast抛弃constness的一个可能用途是调用不使用const参数但仍然不修改其参数,或者只修改其本地副本的C函数 丢弃常量部分,然后修改数据,否则肯定会导致未定义的行为。const\u cast只有在将常量添加到原始非常量变量时才安全。尝试从原始常量对象中删除const状态,然后对其执行写入操作将导致未定义的行为 是相关的
const\u cast
的帮助下,如果有人要修改我声明的常量对象,那么const
限定符有什么用
我的意思是,有人如何确保他所声明的
const
不会被修改?const\u cast抛弃constness的一个可能用途是调用不使用const
参数但仍然不修改其参数,或者只修改其本地副本的C函数
丢弃常量部分,然后修改数据,否则肯定会导致未定义的行为。
const\u cast
只有在将常量添加到原始非常量变量时才安全。尝试从原始常量对象中删除const
状态,然后对其执行写入操作将导致未定义的行为
是相关的
此外,msdn页面还显示(我的重点):
指向任何对象类型的指针或指向数据成员的指针可以显式转换为除常量、volatile和_未对齐限定符之外的相同类型。对于指针和引用,结果将引用原始对象。对于指向数据成员的指针,结果将引用与指向数据成员的原始(uncast)指针相同的成员根据被引用对象的类型,通过结果指针、引用或指向数据成员的指针执行的写入操作可能会产生未定义的行为。
不能使用const_cast运算符直接重写常量变量的常量状态。
您是对的,使用
const_cast
通常表示存在设计缺陷,或者API超出了您的控制范围
但是,有一个例外,它在重载函数的上下文中很有用。我引用了一本C++入门书的例子:
此版本通过将参数强制转换为对const
的引用来调用shorterString
的const版本。该函数返回对常量字符串的引用,我们
know绑定到我们的一个原始非常量参数。因此,我们知道可以安全地将该字符串转换回普通的字符串&
。任何人都不能修改常量对象,无论是否使用常量转换
<代码>常量转换
不允许修改常量对象
在删除常量时,const_cast
的目的是允许您从指向非常量对象的访问路径(指针或引用)中删除常量
比如说
int i = 5;
const int *p = &i;
*const_cast<int *>(p) = 10;
assert(i == 10);
inti=5;
常数int*p=&i;
*const_cast(p)=10;
断言(i==10);
在上述代码中,const\u cast用于通过指针p
获得对对象i
的修改访问权。对象i
本身不是常量,所以这种修改没有错
这就是
const\u cast
的目的。它也可以用于相反的目的:向指针或引用类型添加常量。但是“修改常量对象”不是您可以使用const\u cast
来完成的。常量对象不可修改。我认为非常量到常量是一种向上转换,不需要显式转换?@JanDvorak对于某些指针转换,它是必需的,例如从int**
到int const**
。另一点:您可以安全地从任何未声明const
的对象中删除const
<代码>inti;int const*p=&i;int*pp=const_cast(p)*pp=42代码>是安全的。@DyP,这就是为什么它说“取决于引用对象的类型”;)@SingerOfTheFall我指的是你自己的文字之前的那句话“如果你想用它删除常量,你会得到UB”。这在两个方面是不完整的/精确的:1)UB只会发生在你对该对象执行写操作的情况下2)UB只会发生在对象本身是常量(已定义为常量)的情况下这与const
-限定对象不会改变其可观察的行为。这并不意味着它的位不会被修改。Lazy evaluation(),但可能使用mutable比例如const_cast(this)更好。可能的重复:我会注意到这个例子说明得很糟糕,因为添加const
限定符不需要强制转换。所以真正需要的只有一个(最后一个)。@MatthieuM。如果不使用cast添加常量,您将得到无限递归。@Angew:我不是说添加const
是无用的,我的意思是使用const\u cast
添加它是过分的。例如,您可以使用具有相同效果的命令。@MatthieuM。我认为const\u cast
是合适的工具。使用static\u cast
,您可能会意外更改类型。但这主要是一个编码风格的问题。@Angew:这确实是有争议的,只是任何使用const\u cast
或reinterpret\u cast
都有潜在的危险,因此使用它可能是一种隐式转换。。。请注意,如果我们退出单行程序世界:auto-const&ss1=s1
将在没有虚假的常量投射的情况下实现相同的效果。对吗?代码const int x=42;int*px=const_cast(&x)*px=3代码>显示以修改内存。
string &shorterString(string &s1, string &s2)
{
auto &r = shorterString(const_cast<const string&>(s1),
const_cast<const string&>(s2));
return const_cast<string&>(r);
}
int i = 5;
const int *p = &i;
*const_cast<int *>(p) = 10;
assert(i == 10);