在封闭范围内重新声明变量是不确定的行为?

gaa*_*kam 4 c++ undefined-behavior

#include <iostream>
using namespace std;

int main() {
    int i = 0;
    if(true) {
        int i = 5;
        cout << i << '\n';
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

尝试在Ideone上运行上面的代码,看看它是否合法.结果让我感到困惑:

  • 我们有编译错误(1),(2)
  • 或者此代码5按预期打印(1)
  • 或者它什么都不打印(1),(2)

正如您从我的链接中看到的,每次在Ideone上编译时,相同的代码行为都完全不同!这闻起来像未定义的行为(UB).

OK C++因其不直观的行为而闻名但是! - 我承认它只是我的直觉,但我不希望C++在内部范围UB中重新声明一个变量!Id期望阴影或强制编译错误.

根据C++标准,我的代码真的是UB,还是只是Ideone和/或gcc的特性?如果它是UB,是UB,因为我重新申报i或出于其他原因我现在没有注意到?

R S*_*ahu 7

在封闭范围内重新声明变量是UB吗?

不它不是.

您看到的编译器错误很可能是由i声明外部但未使用的事实引起的.

否则,你的代码就好了.

它在https://ideone.com/AwVJqZ以及我的桌面上都适用于我.

  • @gaazkam因为IDEOne是垃圾吗?我建议使用[Wandbox](https://wandbox.org/)或[coliru](http://coliru.stacked-crooked.com/) (2认同)
  • 声明但未使用不是错误,除非有人正在使用一个将警告视为错误的开关进行编译.在这种情况下,编译器不符合语言定义,所有投注都关闭. (2认同)