标签:const-cast c undefined-behavior const
作为我之前的问题(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
如果没有,我会参考哪个标准来解释?
解决方法:
是的,你的代码是有效的,虽然不推荐,只要你开始的对象实例是非const(代码中的情况,程序;非const).
从const实例中删除常量是UB(未定义的行为).从casted-to const初始非const实例中删除const-ness是明确定义的,参见例如const_cast
的文档.
如果您确实需要从const成员函数修改成员变量,请考虑将前者标记为mutable
.否则,当有人(错误地)在const实例上调用您的成员函数时,您当前的技术将导致UB.
标签:const-cast,c,undefined-behavior,const 来源: https://codeday.me/bug/20190727/1552172.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。