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