为什么没有从指针到引用的隐式转换?

bra*_*o23 1 c++ c++03

#include <iostream>
using namespace std;

int main() {
    int x = 5;
    int* y = &x;
    int& z = y;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于此代码,编译器给出以下错误int& z = y;

./example.cpp: In function 'int main()':

./example.cpp:7:11: error: invalid conversion from 'int*' to 'int' [-fpermissive]

    7 |  int& z = y;

      |           ^

      |           |

      |           int*

./example.cpp:7:11: error: cannot bind rvalue '(int)y' to 'int&'
Run Code Online (Sandbox Code Playgroud)

为什么?我知道为什么会出错,而且我知道如何解决它,我很好奇为什么编译器无法隐式执行转换,对我而言,我的意图似乎微不足道,是使指针和引用引用相同的内存位置。我想念什么极端情况吗?

lub*_*bgr 5

C ++源自隐式转换的错误由来已久。看看Stephen Dewhurst的书“ C ++ Gotchas”;最长的一章是关于转化的。这个主题实际上充满了陷阱,我们应该高兴地明确指出以上内容。话虽如此...

我想念什么极端情况吗?

考虑这样的重载集:

void f(void *n);
void f(int& n);
Run Code Online (Sandbox Code Playgroud)

并将指针隐式转换为引用的映像。以下通话

int n = 42;

f(&n);
Run Code Online (Sandbox Code Playgroud)

这将是模棱两可的,因为两个转换都被认为是等效的。这会混淆不必要的内容。

另一个例子是对指针的引用。不一定您会经常做的事情,但这是有效的:

int n = 42;
int* ptr = &n;

int*& refToPtr = ptr;
Run Code Online (Sandbox Code Playgroud)

有了引用转换的隐式指针,上面的代码将编译为

int& refToPtr = &n;
Run Code Online (Sandbox Code Playgroud)

同样,即使您的意思有所不同,但再次允许的是,减少这种错误是一件好事。