作为我之前的问题(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
如果没有,我将参考标准的哪一部分进行解释?
答案 0 :(得分:7)
是的,你的代码是有效的,虽然不推荐,只要你开始的对象实例是非const
(你的代码就是这种情况,A program;
是非const的) 。
从const
实例中移除const
- 是UB(未定义的行为)。从已投放到const
初始非const
实例中移除const
- 已明确定义,请参阅例如const_cast
的文档。
如果您确实需要从const
成员函数修改成员变量,请考虑将前者标记为mutable
。否则,只要有人(错误地)在const
实例上调用您的成员函数,您当前的技术就会导致UB。