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

Is it safe to bind an unsigned int to a signed int reference?

在同事的代码中遇到类似的东西后,我无法理解 why/how 此代码执行时没有编译器警告或错误。

#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";
}

输出:

u=42 s=42
u=54 s=42

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

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

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