抛弃方法

时间:2017-04-28 18:02:20

标签: c++ const undefined-behavior const-cast

作为我之前的问题(Writing to class member through const &)的后续内容,是否也很好地定义并正确抛弃类成员方法的常量?

class A
{
public:
    A()
    : a(5)
    {
    }

    int run() const
    {
        std::cout << "a: " << a << std::endl;
        int& x = (int&)a;
        x = 17;
        std::cout << "a: " << a << std::endl;
        return 0;
    }

private:
    int a;
};

int main()
{
    A program;
    return program.run();
}

输出(在cpp.sh上用c ++ 14测试-O0,-Wall,-Wextra和-Wpedantic):

a: 5
a: 17

如果没有,我将参考标准的哪一部分进行解释?

1 个答案:

答案 0 :(得分:7)

是的,你的代码是有效的,虽然不推荐,只要你开始的对象实例是非const(你的代码就是这种情况,A program;是非const的) 。

const实例中移除const - 是UB(未定义的行为)。从已投放到const初始非const实例中移除const - 已明确定义,请参阅例如const_cast的文档。

如果您确实需要从const成员函数修改成员变量,请考虑将前者标记为mutable。否则,只要有人(错误地)在const实例上调用您的成员函数,您当前的技术就会导致UB。