我有时会遇到变量有意义的情况const
,但仅限于其范围的后半部分.例如,块的第一部分可能设置值,如果很明显我们已经"完成"设置该变量,则其余部分的可读性可能会提高 -
void foo() { int n; // Do things that result in initialization of n freeze n; // Imaginary construct that declares "n" const for rest of scope // Later steps that depend on 'n' but do not change it }
有没有捕获这种模式的C++习语?当然,块的后半部分可以移动到一个单独的功能,但是可以在不移动任何东西的情况下完成吗?
您的"冻结"代码可能如下所示:
const int &refN = n;
然后你用refN
而不是n
.你可以切换周围的名字.
有更复杂的解决方案,但你真的要问自己,增益是否值得痛苦.如果您的功能非常复杂,以至于您无法一眼就看出是否已修改,n
那么您需要重构代码.
例如,隐藏n
你可以这样做:
{ const int &_tmp = n; const int &n = _tmp; // rest of code }
但你必须问自己是否值得.谁会在你想知道你在吸烟之后阅读这些代码.
另一种选择是你的功能:
const int n = setup_n();
在哪里将逻辑卸载到另一个函数或lambda:
const int n = [](){ // ...logic... return finalized_value; }();