Bas*_*ith -2 c++ reference rust
C++ 中的代码
#include <iostream>
#include <string>
using namespace std;
int main() {
string food = "Burger";
cout << &food << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用 Rust 编写的相同代码:
fn main() {
let food = "Burger";
prinln!("{}", &food);
}
Run Code Online (Sandbox Code Playgroud)
C++ 程序的输出:
0x7fff604b2890
Run Code Online (Sandbox Code Playgroud)
Rust 程序的输出:
Burger
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我错过了什么?
首先,在 C++ 中,&(address-of)运算符返回一个指针,也就是说,给定T t;,&t将返回一个T*。
C++ 确实有引用 ( T&),它们不是通过&运算符创建的,我会为您指出这个很好的答案,以了解 C 指针和 C++ 引用之间的众多差异。
现在回答你的问题,引用的概念在 C++ 和 Rust 之间是完全不同的。
Rust 的引用基本上是智能指针。如果我们从上面的链接中找到列表,Rust 引用了:
它们也是使用&运算符创建的,它们都是指针属性。
现在,虽然它们是指针,但它们不是 C 指针,但它们是“智能的”,因为它们是(类型)安全的,因此像 C++ 引用一样不能是null,或悬空。但这使它们成为安全/理智的指针。总的来说,他们仍然经常表现得像指针一样。
至于您缺少什么,答案是Display(用于格式化事物的特征)是通过委托给父对象在引用上全面实现的,因此当您打印“引用”时,它将打印所引用的任何内容,因为...这更有用,特别是考虑到 Rust 中的常见引用(它们非常非常常见)[0]。
如果你想引用的“指针值”,就可以使用该指针值的格式说明符(感谢trentcl):
println!("{:p}", &food);
Run Code Online (Sandbox Code Playgroud)
(您也可以转换为原始指针,这是我最初编写的,但如果您只想打印该值,则需要做更多的工作以获得很少的回报)。
[0]是公平的其他锈病智能指针的行为是一样的:Box,Rc,和朋友都委托Display给底层类型