抛弃方法的常量性

Casting away const-ness of method

作为我上一个问题 () 的后续,像这样抛弃 class 成员方法的常量性是否也定义明确且正确?

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();
}

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

a: 5
a: 17

如果不是,我会参考标准的哪一部分进行解释?

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

const 实例中删除 const-ness 是 UB(未定义行为)。从 casted-to-const 初始非 const 实例中删除 const-ness 是明确定义的,参见例如const_cast.

的文档

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