由范围引起的C++条件存储分配 目前我在C++中阅读思考。

由范围引起的C++条件存储分配 目前我在C++中阅读思考。,c++,memory-management,constructor,initialization,C++,Memory Management,Constructor,Initialization,我对对象的条件存储分配感到困惑 如下面的代码所示,goto和开关将生成警告或错误 但if-else工作正常,在执行过程中有条件地通过 那么,为什么if-else没有警告或错误呢 更新: C++这样做是为了保证一个对象不能被创建,除非它也被初始化。但是在if-else的情况下,如何初始化它的两个部分,因为只有一个部分将通过 作为C++,在C的实践中,在该范围的开放支撑下分配范围的存储。p> 这是我的想法我不知道怎么了 但是对于switch和goto是一样的,只需要初始化令牌案例,但是存在初始化错误

我对对象的条件存储分配感到困惑

如下面的代码所示,goto和开关将生成警告或错误

但if-else工作正常,在执行过程中有条件地通过

那么,为什么if-else没有警告或错误呢

更新:

C++这样做是为了保证一个对象不能被创建,除非它也被初始化。但是在if-else的情况下,如何初始化它的两个部分,因为只有一个部分将通过

作为C++,在C的实践中,在该范围的开放支撑下分配范围的存储。p> 这是我的想法我不知道怎么了

但是对于switch和goto是一样的,只需要初始化令牌案例,但是存在初始化错误。if-else和开关都只服从令牌分支的初始化

最后,我发现关键词是范围。随着C++在C语言中的实践,在该范围的开放支撑下进行存储分配。因此,从具有自动存储持续时间的变量不在作用域内的点跳到其在作用域内的点的程序是格式错误的,除非该变量具有标量类型、具有普通默认构造函数和普通析构函数的类类型(这些类型之一的cv限定版本),或前面类型之一的数组,并且在声明时没有初始值设定项规则。请确保变量在分配后初始化


谢谢大家。

不允许跳过变量声明,除非它是标量或具有普通的默认构造函数,这将在第6.7节中介绍:

可以传输到块中,但不能以通过初始化绕过声明的方式传输。从具有自动存储持续时间的变量不在范围内的点跳到其在范围内的点的程序是格式错误的,除非该变量具有标量类型、具有普通默认构造函数和普通析构函数的类类型(这些类型之一的cv限定版本),或上述类型之一的数组,并且声明时不使用初始值设定项8.5

在切换的情况下,避免此问题的一种方法是在每个标签处使用{}创建一个作用域,如下所示:

switch(i)
{
   case 1: { X x5;  break; }
   case 2: { X x6;  break; }
}

不允许跳过变量的声明,除非它是标量或具有普通的默认构造函数,这将在第6.7节中介绍:

可以传输到块中,但不能以通过初始化绕过声明的方式传输。从具有自动存储持续时间的变量不在范围内的点跳到其在范围内的点的程序是格式错误的,除非该变量具有标量类型、具有普通默认构造函数和普通析构函数的类类型(这些类型之一的cv限定版本),或上述类型之一的数组,并且声明时不使用初始值设定项8.5

在切换的情况下,避免此问题的一种方法是在每个标签处使用{}创建一个作用域,如下所示:

switch(i)
{
   case 1: { X x5;  break; }
   case 2: { X x6;  break; }
}

你为什么用goto?为什么要在代码块中声明对象并将其丢弃?为什么函数f什么都不做?我正在做一个实验,想弄清楚有关存储分配的一些细节。为什么要使用goto?为什么要在代码块中声明对象并将其丢弃?为什么函数f什么都不做?我正在做一个实验,想弄清楚关于存储分配的一些细节。我想问的是为什么if-else可以正常工作?“这不是某种跳转吗?”罗洛如果不是跳转语句。跳转语句是break、continue、return和goto,在第6.6节中介绍。跳转语句。if语句被分类为选择语句。if的主体将有自己的作用域,并且在该局部作用域中声明的任何变量都不会存在于其外部。但是,当我删除break-in开关时,仍然存在初始化错误。这是否意味着switch属于跳转语句,或者可能被转换为类似的语句?@loolou这是因为只有一个作用域覆盖了所有的case标签,您可以在switch中通过在每个标签上使用{}来解决这个问题。我会更新我的答案。那么这有什么好处呢?我想问的是为什么if-else可以正常工作?“这不是某种跳转吗?”罗洛如果不是跳转语句。跳转语句是break、continue、return和goto,在第6.6节中介绍。跳转语句。if语句被分类为选择语句。if的主体将有自己的作用域,并且在该局部作用域中声明的任何变量都不会存在于其外部。但是,当我删除break-in开关时,仍然存在初始化错误。这是否意味着开关属于跳转语句还是m
可以转换成这样吗?@loolou这是因为只有一个作用域覆盖了所有的大小写标签,您可以通过在每个标签上使用{}在开关中绕过这个问题。我会更新我的答案。那么这有什么好处呢?