#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)
为什么?我知道为什么会出错,而且我知道如何解决它,我很好奇为什么编译器无法隐式执行转换,对我而言,我的意图似乎微不足道,是使指针和引用引用相同的内存位置。我想念什么极端情况吗?
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)
同样,即使您的意思有所不同,但再次允许的是,减少这种错误是一件好事。
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |