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

问题描述 投票:0回答:1

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

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

c++ rust reference
1个回答
14
投票

首先,在 C++ 中,

&
(地址)运算符返回一个指针,也就是说,给定
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
委托给基础类型

© www.soinside.com 2019 - 2024. All rights reserved.