GCC编译器如何进行类型转换?为什么Mac和Linux上的输出不同?

-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有什么区别?

还是一个错误?

rai*_*ner 6

您没有进行任何类型转换,而是在作用域内创建了第二个 转换,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)