以下是使用const_cast未定义的行为吗?

时间:2014-08-20 14:04:39

标签: c++ language-lawyer

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

以下代码是有效还是未定义的行为? 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();
}

2 个答案:

答案 0 :(得分:8)

行为定义明确:

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

  

[注意:根据对象的类型,写入操作通过指针,左值或指针到数据成员由const_cast转换为const -qualifier可能会产生未定义的行为。 - 后注]

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

答案 1 :(得分:4)

我认为它定义明确,因为标准仅将未定义的行为归因于修改 const对象。 C ++ 11引用如下:

[expr.const.cast]5.2.11§7

  

[注意:取决于对象的类型,通过指针,左值或指针进行写操作   从const_cast生成的数据成员转出const限定符可能会产生未定义的   行为(7.1.6.1)。 -end note ]

[dcl.type.cv]7.1.6.1§4

  

除了可以修改声明mutable(7.1.1)的任何类成员之外,任何修改const的尝试都是如此   对象在其生命周期(3.8)中导致未定义的行为。 ...

GetA()实际上并不修改任何对象,因此它没有未定义的行为。