繁体   English   中英

抛弃方法的常数

[英]Casting away const-ness of method

作为我之前的问题的后续( 通过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

如果没有,我会参考哪个标准来解释?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM