是否存在向局部变量添加 const 限定符会引入运行时错误的情况?
Is there a scenario where adding a const qualifier to a local variable could introduce a runtime error?
这是我多次执行过的(公认的脑死亡)重构算法:
- 从一个
.cpp
文件开始,该文件编译干净并且 (AFAICT) 工作正常。
- 通读文件,只要有 local/stack-variable 声明而没有
const
关键字,就在其声明前加上 const
关键字。
- 再次编译
.cpp
文件
- 如果报告了任何新的编译时错误,请检查相关代码行以确定原因——如果证明局部变量确实需要非
const
,请删除 const
关键字从中;否则修复 const
关键字添加所揭示的任何潜在问题。
- 转到 (3) 直到
.cpp
文件再次编译干净
暂时搁置“const 所有局部变量”是否是个好主意,这种做法是否有引入run-time/logic的风险程序中不会在编译时捕获的错误? AFAICT 这似乎是“安全的”,因为它不会引入回归,只会引入编译时错误,然后我可以立即修复这些错误;但 C++ 是一个多姿多彩的东西,所以也许有一些我没有想到的风险。
const
没有运行时影响,编译器不会在编译时告诉您构建失败。
如果您愿意接受人为的示例,您可能会进入未定义行为的世界。
void increment(int & num)
{
++num;
}
int main()
{
int n = 99;
increment(const_cast<int&>(n));
cout << n;
}
上面的编译输出100,下面的编译可以为所欲为(但我碰巧输出99)。 Modifying a const object through a non-const access path results in undefined behavior.
void increment(int & num)
{
++num;
}
int main()
{
const int n = 99;
increment(const_cast<int&>(n));
cout << n;
}
是的,这是人为的,因为为什么有人会对非 const
对象执行 const_cast
?另一方面,这是一个简单的例子。也许在更复杂的代码中,这实际上可能会出现。 耸耸肩我不会说这是一个很大的风险,但它确实属于“任何风险”,如问题中所述。
这是我多次执行过的(公认的脑死亡)重构算法:
- 从一个
.cpp
文件开始,该文件编译干净并且 (AFAICT) 工作正常。 - 通读文件,只要有 local/stack-variable 声明而没有
const
关键字,就在其声明前加上const
关键字。 - 再次编译
.cpp
文件 - 如果报告了任何新的编译时错误,请检查相关代码行以确定原因——如果证明局部变量确实需要非
const
,请删除const
关键字从中;否则修复const
关键字添加所揭示的任何潜在问题。 - 转到 (3) 直到
.cpp
文件再次编译干净
暂时搁置“const 所有局部变量”是否是个好主意,这种做法是否有引入run-time/logic的风险程序中不会在编译时捕获的错误? AFAICT 这似乎是“安全的”,因为它不会引入回归,只会引入编译时错误,然后我可以立即修复这些错误;但 C++ 是一个多姿多彩的东西,所以也许有一些我没有想到的风险。
const
没有运行时影响,编译器不会在编译时告诉您构建失败。
如果您愿意接受人为的示例,您可能会进入未定义行为的世界。
void increment(int & num)
{
++num;
}
int main()
{
int n = 99;
increment(const_cast<int&>(n));
cout << n;
}
上面的编译输出100,下面的编译可以为所欲为(但我碰巧输出99)。 Modifying a const object through a non-const access path results in undefined behavior.
void increment(int & num)
{
++num;
}
int main()
{
const int n = 99;
increment(const_cast<int&>(n));
cout << n;
}
是的,这是人为的,因为为什么有人会对非 const
对象执行 const_cast
?另一方面,这是一个简单的例子。也许在更复杂的代码中,这实际上可能会出现。 耸耸肩我不会说这是一个很大的风险,但它确实属于“任何风险”,如问题中所述。