C++ 和 Rust 中“引用”的概念是否不同?

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)

为什么会这样?我错过了什么?

Mas*_*inn 8

首先,在 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]是公平的其他锈病智能指针的行为是一样的:BoxRc,和朋友都委托Display给底层类型

  • 有一个明确用于指针的格式说明符和特征: `println!("{:p}", &amp;food);` 将实现这一点,而无需转换为原始指针。这同样适用于其他类型的指针,例如“Arc”和“Box”。 (2认同)