为什么可以在没有初始化项的情况下跳转到标量类型对象的作用域?
Why is it OK to jump into the scope of an object of scalar type w/o an initializer?
当我阅读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
可以跳过赋值语句并不奇怪;声明本身并没有做任何事情,除非有初始化式
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 特征中的自定义标量类型
- 标量类型的特征模板无法编译固定大小的子矩阵操作
- 请求从"点*"转换为非标量类型"点"
- 标量类型上的特征模板
- 错误:在 C++ 中从 'Counter' 转换为非标量类型'CountDn'
- 特征:从数组类型中获取标量类型是否记录?
- 错误:请求从"Mstream"转换为非标量类型"std::string {aka std::basic_string<char>}"
- Arduino trim() 和 replace() 方法返回从 'void' 到非标量类型'String'请求的转换
- 错误:移动文件时'QString'为非标量类型"std::__cxx11::字符串"
- 标量类型附加C++
- 复制初始化 - 从 'int' 类型转换为非标量类型
- 在 opencv 上将 vec 类型转换为标量类型
- 为矢量对象请求转换为非标量类型
- 错误:请求从 std::chrono::time_point 浮点数转换为非标量类型长整型
- 此错误的含义是什么:从 'char* [40] 转换为非标量类型 'std::string
- 小标量类型和谷歌协议缓冲区
- 我可以强制执行标量类型通过 int{} 初始化为零吗?