Rust中的“*const()”是什么?

10

那么,在 Rust 中,“*const ()” 究竟是什么?我似乎可以将某些基本值(整数值、函数)转换为此类型,就像下面的代码所示:

let foo = 1;
let pointer = foo as *const ();  // this works.

但是对于浮点数等类型,编译器不允许我们进行上述类型强制转换。那么在Rust中,“*const()”是什么?它是否类似于C/C++中的“void *”? 如果是这样,为什么它不支持指向浮点数的指针?

另外,此模式当前在参考文档中的使用案例已添加:https://doc.rust-lang.org/std/mem/fn.transmute.html.

fn foo() -> i32 {
    0
}
let pointer = foo as *const ();  // here it is!!!
let function = unsafe {
    std::mem::transmute::<*const (), fn() -> i32>(pointer)
};
assert_eq!(function(), 0);

@eggyal 这不是我想要的。我的好奇心在于“指向单元值的原始指针”,因为在Rust中,单元值有点无用和琐碎,所以我想知道我们可以在什么样的场景下使用这种模式。 - Jason Yu
@eggyal 我明白了,为什么浮点数不能有点奇怪。 - Jason Yu
为什么?内存地址是整数。3.141 as *const()会代表哪个内存地址? - eggyal
@eggyal,你说得对,很抱歉,我搞混了引用转换。在这里我们使用的是值本身。 - Jason Yu
2个回答

9

*const ()非常类似于C语言的const* void,唯一不同的是()表示确切的一个值,而void则表示没有值。 有关()void之间差异的相关答案

如果是这样,为什么它不支持指向浮点数呢?

它支持,只是foo as *const ()与指向浮点数没有任何关系,它是将一个值转换为具有相同数值的指针,这对于浮点数是没有意义的。


1
我认为这有点误导人,因为(const) void*并不是真正指向void的指针;它是一个非常特殊的情况。因此,void() 之间的区别并不能告诉你const void**const ()之间的区别。 - Alexey Romanov

3
这个例子只是使用*const ()作为任意非函数指针类型,正如它所说:
指针转换为函数指针。
对于*const i32或其他类型,情况完全相同,但作者需要选择一个最简单的类型,()就是其中之一。
并不是很像C/C++中的void*。它是指向()的指针,后者是一个完全普通的类型(如果大小为零),没有特殊规则void*那样。另请参见 Rust的一个奇怪现象:指向大小为零的类型的指针

最终结论:在C和C++中,对void*进行算术运算都是非法的(而使用*const()上的.offset进行算术运算是完全可以的)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接