将 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
.
在同事的代码中遇到类似的东西后,我无法理解 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
.