如果实际对象不是const,则具有写操作的const_cast(this)是否具有未定义的行为?

Ben*_*ler 3 c++ language-lawyer

我的问题是由我对另一个问题的回答所启发的:https : //stackoverflow.com/a/56989169/2492801

如果我有一个真正的非const对象,但调用它的一个const方法,那里面的方法thisconst当然的。如果我const_cast放弃其常量性并将其传递给对所指向的对象执行写操作的另一种方法,那this是未定义的行为吗?

如果确实如此,我不会感到惊讶,因为this它确实constconst方法内部。另一方面,对象本身不是对象,const因此通常不禁止写操作。

对我来说,重要的是要知道如何处理我的其他问题中所述的问题。谢谢!

Som*_*ken 8

这不是不确定的。那正是const_cast目的。只要对象本身是非指针,const则可以将其抛弃const_cast并作为非const指针执行相同的操作。

请注意,const_cast通常将其视为代码异味,并且可能表明设计不好。


正如标准所说

在非static([class.mfct])成员函数的主体中,关键字this是prvalue,其值是指向为其调用该函数的对象的指针。在类的成员函数中,此类型XX*。如果将成员函数声明为const,则其类型为const X*;如果声明了成员函数volatile,则其类型为volatile X*;如果声明了成员函数 const volatile,则其类型为const volatile X*

该类型thisconst X*在你的情况下,即使对象本身是非const


该标准说,这大概const_cast

对于两个相似的类型T1T2,类型的prvalue T1可以明确地转化为式T2使用const_­cast。a的结果const_­cast引用原始实体。

所以,从铸造const X*X*也是合法的。


最后,它说(尽管有注释):

[?注:根据对象的类型,通过const_cast抛弃const-qualifier 的指针,左值或指向数据成员的指针的写操作可能会产生不确定的行为([dcl.type.cv])。-?尾注?]

[dcl.type.cv] 告诉我们

在生存期([basic.life])内修改const对象([basic.type.qualifier])的任何尝试([expr.ass],[expr.post.incr],[expr.pre.incr])都会导致以未定义的行为。

幸运的是,我们this指向的是非const对象,因此将其强制转换然后通过新的非const指针修改此对象不会触发未定义的行为。


抱歉,Angew。

  • 这里唯一的气味是一只很棒的鸡的味道。 (2认同)