为什么指针不能转换为引用?

Aci*_*dic 0 c++ pointers reference

我在多个来源中读到,C++引用只不过是一个带有编译时间限制的指针.

如果这是真的,为什么我被迫取消引用一个指针,以便将它传递给一个需要参数的函数?

void FooRef(const int&);
void FooPointer(const int*);

int main()
{
    int* p = new int(5);
    FooPointer(p);
    FooRef(*p); // why do I have to dereference the pointer?

    ...
}
Run Code Online (Sandbox Code Playgroud)

据我了解,如果我要传递intFooRef编译器将为我创建变量地址的指针(引用),但如果该类型已经是指针,那么解除引用它似乎毫无意义.在我看来,我正在取消引用一个指针,只是为了让编译器从取消引用的值创建另一个指针,这对我来说似乎毫无意义.
仅复制指针而不仅仅是引用+引用该值是不是更简单/更高效?(也许这真的发生了什么?)

我在这里错过了什么吗?调用FooRef这种情况比调用慢FooPointer吗?
在编译期间,引用和指针是否真的产生相同的代码?

Cha*_*via 9

参考可以在引擎盖下的指针实现的事实是无关紧要的.许多编程概念可以根据其他事情来实现.您也可以问为什么我们有while循环时while可以用goto或实现jmp.不同语言概念的要点是让程序员更容易,而引用是为方便程序员而设计的语言概念.

你可能误解了引用的目的.引用为你提供指针的正面(便宜传递),但由于它们具有与常规值相同的语义,它们消除了使用指针带来的许多危险:(指针算术,悬空指针等)更多重要的是,一个参考是一个完全不同的类型比在C++型系统中的指针,这将是疯狂,以允许所述两个可以互换(即会破坏引用的目的.)

引用语法的目的是为了镜像常规值语义的语法 - 同时为您提供廉价传递内存地址而不是复制整个值的能力.

现在,转到你的例子:

FooRef(*p); // why do I have to dereference the pointer?
Run Code Online (Sandbox Code Playgroud)

你必须取消引用此指针,因为FooRef需要引用int,而不是一个参考int*.请注意,您还可以引用指针:

void FooPointerRef(const int*&);
Run Code Online (Sandbox Code Playgroud)

引用指针的函数使您可以从函数内修改指针的内存地址.在您的示例中,您必须显式取消引用镜像值语义的指针.否则,查看函数调用FooRef(p)的人会认为FooRef要么是逐个值,要么是逐个引用 - 而不是(非指针)值或引用.