下面是const_cast未定义行为的用法

Is the following use of const_cast undefined behavior?

本文关键字:用法 未定义 cast const      更新时间:2023-10-16

这是一个关于语言律师的问题,而不是一个很好的练习问题。

以下代码是有效的还是未定义的行为?const对象最终调用非const函数,但它实际上并不修改对象的状态。

struct Bob
{
    Bob() : a(0) {}
    int& GetA()
    {
        return a;
    }
    const int& GetA() const
    {
        return const_cast<Bob&>(*this).GetA();
    }
    int a;
};
int main()
{
    const Bob b;
    int a = b.GetA();
}

行为定义良好:

c++标准,第5.2.11/7节[const cast]

注意:根据对象类型的不同,通过指向数据成员的指针、左值或指针进行的写操作可能会产生未定义的行为。-end note]

GetA()不写入Bob的任何成员,因此该程序不涉及未定义行为。

我相信它是定义良好的,因为标准只将未定义的行为归因于修改 const对象。c++ 11后面跟着引号:

[expr.const。铸造]5.2.11§7

[注:根据对象的类型,可通过指针、左值或指针进行写操作去掉常量限定符的const_cast所产生的数据成员可能产生undefined行为(7.1.6.1)。 -end note]

[dcl.type。Cv] 7.1.6.1§4

除了可以修改任何声明为mutable(7.1.1)的类成员,任何修改const的尝试对象的生命周期(3.8)导致未定义行为. ...

GetA()实际上没有修改任何对象,所以它没有未定义的行为。