-2 c++ type-conversion shadowing undefined-behavior c++11
我在范围内进行了变量b(范围外的声明)的类型转换,并为b赋予了新的val,当范围结束时,b的val似乎是错误的。
这是在我的Macbook上发生的,它的gcc版本是gcc-8(Homebrew GCC 8.3.0)8.3.0。我在gcc版本为5.4.0的linux笔记本电脑上尝试了相同的代码,并且代码运行良好。
std::vector<int> a = {1,2,3,4};
int b;
{
size_t i = 0, b = a[i];
//this time type of b is size_t
++i;
b = a[i];
}
std::cout << "b = " << b << std::endl;
Run Code Online (Sandbox Code Playgroud)
在我的Mac上,结果是b = 0
在Ubuntu 16上,结果是b = 1
类型转换的两个版本的gcc有什么区别?
还是一个错误?
您没有进行任何类型转换,而是在作用域内创建了第二个 转换,b由于它具有相同的名称,因此在外部覆盖了阴影b。这意味着您正在向内部分配某些内容b,而外部b保持不变。合并范围结束时(在右大括号处),您剩下了(未初始化的)outer b,并且打印它会调用未定义的行为,这正是您所遇到的。
这段代码在语义上是等效的,可能会更好地说明实际情况:
vector<int> a = {1,2,3,4};
int outer_b;
{
size_t i = 0, inner_b = a[i];
//this time type of b is size_t
++i;
inner_b = a[i];
}
cout << "b = " << outer_b << endl;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |