C++代码
#include <iostream>
#include <string>
using namespace std;
int main() {
string food = "Burger";
cout << &food << endl;
return 0;
}
用 Rust 编写的相同代码:
fn main() {
let food = "Burger";
prinln!("{}", &food);
}
C++ 程序的输出:
0x7fff604b2890
Rust 程序的输出:
Burger
为什么会这样?我错过了什么?
&
(地址)运算符返回一个指针,也就是说,给定 T t;
,&t
将返回一个T*
。
C++ 确实有引用 (
T&
),它们不是通过 &
运算符创建的,我将向您指出 这个关于 C 指针和 C++ 引用之间众多差异的好答案。
现在回答你的问题,C++ 和 Rust 之间的引用概念是完全不同的。
Rust 的引用本质上是智能指针。如果我们从上面的链接中查看列表,Rust 参考文献:
它们也是使用
&
运算符创建的,它们都是指针属性。
现在,虽然它们是指针,但它们不是 C 指针,它们是“智能”的,因为它们是(类型)安全的,因此像 C++ 引用一样,不能是
null
或悬空。但这使它们成为安全/理智的指针。总的来说,他们仍然经常充当指针。
Display
(用于格式化事物的特征)是通过委托给父对象在引用上全面实现的,所以当你打印“引用”时,它将打印无论引用什么,因为......这更有用,特别是考虑到 Rust 中的常见引用(它们非常非常常见)[0]。
如果您想要引用的“指针值”,您可以使用指针值格式说明符(感谢trentcl):
println!("{:p}", &food);
(您也可以转换为原始指针,这是我最初编写的,但如果您只想打印该值,则需要做更多的工作而收效甚微)。
[0] 公平地说,其他 Rust 智能指针的行为是相同的:
Box
、Rc
,并且朋友们都将 Display
委托给基础类型