为什么可以在没有初始化项的情况下跳转到标量类型对象的作用域?

Why is it OK to jump into the scope of an object of scalar type w/o an initializer?

本文关键字:标量 类型 对象 作用域 情况下 初始化 为什么      更新时间:2023-10-16

当我阅读c++标准时,似乎下面的代码完全符合标准。

int main() {
   goto lol;
   {
      int x;
lol:
      cout << x << endl;
   }
}
// OK

[n3290: 6.7/3]:可以转移到块中,但不能转移到a中通过初始化绕过声明的方式。一个程序从具有自动存储持续时间的变量所在的点跳转不在作用域内的是病态的,除非变量具有标量类型,类类型具有简单的默认值构造函数和普通析构函数,其中一个的cv限定版本这些类型,或者前面类型之一的数组,并且被声明.

为什么它应该工作?跳过它的定义而使用未定义的x不是很危险吗?为什么存在初始化式会有什么不同呢?

无论如何,您将使用未初始化的x,因为int x;是未初始化的。初始化式的存在当然会造成差异,因为您将跳过它。例如,int x = 5;初始化x,因此您是否跳过它将产生差异。

跳过它的定义而使用未初始化的x不是很危险吗?

但是x无论如何都是未初始化的,因为它的声明没有初始化器!因此,goto可能会跳过设置(某种程度上初始化)x的赋值语句,但goto可以跳过赋值语句并不奇怪;声明本身并没有做任何事情,除非有初始化式