将 unsigned int 绑定到signed int 引用是否安全?

Tim*_*all 30 c++ reference

在同事的代码中遇到类似的内容后,我无法理解为什么/如何在没有编译器警告或错误的情况下执行该代码。

#include <iostream>

int main (void)
{
    unsigned int u = 42;

    const int& s = u;

    std::cout << "u=" << u << " s=" << s << "\n";

    u = 6 * 9;

    std::cout << "u=" << u << " s=" << s << "\n";
}
Run Code Online (Sandbox Code Playgroud)

输出:

u=42 s=42
u=54 s=42
Run Code Online (Sandbox Code Playgroud)

首先,当我像这样混合有符号/无符号整数时,我希望编译器发出某种诊断。如果我尝试与 进行比较,当然会如此<。这是让我困惑的一件事。

其次,我不确定第二行输出是如何生成的。我预计 的值为s54。这是如何工作的?编译器是否创建一个匿名的、自动带符号的整数变量,分配 的值u,并将引用指向s该值?或者它正在做其他事情,比如s从引用更改为普通整数变量?

son*_*yao 25

引用不能直接绑定到不同类型的对象。给定const int& s = u;,u被隐式转换为intfirst,这是一个临时的、全新的对象,然后s绑定到临时的int。(对const(和右值引用)的左值引用可以绑定到临时变量。)临时变量的生命周期延长到 的生命周期s,即当退出 时它将被销毁main

  • 感谢您的解释。这对我来说完全违反直觉。难怪人们为什么害怕 C++! (2认同)