是否存在向局部变量添加 const 限定符会引入运行时错误的情况?

Is there a scenario where adding a const qualifier to a local variable could introduce a runtime error?

这是我多次执行过的(公认的脑死亡)重构算法:

  1. 从一个 .cpp 文件开始,该文件编译干净并且 (AFAICT) 工作正常。
  2. 通读文件,只要有 local/stack-variable 声明而没有 const 关键字,就在其声明前加上 const 关键字。
  3. 再次编译 .cpp 文件
  4. 如果报告了任何新的编译时错误,请检查相关代码行以确定原因——如果证明局部变量确实需要非 const,请删除 const关键字从中;否则修复 const 关键字添加所揭示的任何潜在问题。
  5. 转到 (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?另一方面,这是一个简单的例子。也许在更复杂的代码中,这实际上可能会出现。 耸耸肩我不会说这是一个很大的风险,但它确实属于“任何风险”,如问题中所述。