我刚看到这样的代码
/* whatever */ foo(std::string const& s) {
// stuff
auto L = s.length();
int i{/* init based on L */};
while (i < L) {
// do other stuff and maybe
++i;
}
}
我想建议大家不要定义L
,而是写/* init based on s.length() */
和(i < s.length())
,而不是/* init based on L */
和(i < L)
。
但是,谁真的告诉我,s.length()
不会因为与s
参数对应的参数被另一个并发线程更改而不可预测地更改呢?
1条答案
按热度按时间slwdgvem1#
不,没有人能告诉你,这是对
const
对象含义的一种常见误解。一个
const
对象并不是一个承诺,当您处理自己的事务时,其他执行线程不能修改该对象。const
对象承诺访问const
对象的代码不能修改该对象(无论“修改”对所讨论的对象意味着什么)。实际上,根本不需要涉及其他执行线程,这个
foo
函数,在“填充”部分,可以调用其他一些函数,这些函数可以通过指针或引用访问完全相同的const
对象,并彻底改变它的内部和外部,然后返回到这个foo
函数。