假设你能做到这一点,你可以写:
const int c = 0;
void updatePointer(const int* &i) {
i = &c;
}
int main() {
int *ptr;
updatePointer(ptr);
*ptr = 1; // attempt to modify the const object c, undefined behavior
}
的const
的目的是为了确保用户代码不能试图修改const对象,除非它包含一个常量播(或当量)。所以编译器必须拒绝这个代码。禁止将const int*&
绑定到int*
是上述代码中唯一适合编译器拒绝的地方:每隔一行都可以。
这与您无法将int**
隐式转换为const int **
的原因相同。
除了在const-safety方面的动机之外,你可以认为它是否与是不同类型的const int*
,它恰好可以转换为它。同样,你可以转换到int
double
,但double&
不能绑定到int
左值。这不是完整的原因,因为实际上int*
和const int*
具有相同的大小和表示,而int
和double
不具有。因此,如果不是因为它会打破const系统,那么可能会有一个特殊情况。
C++对strchr
有const和non-const超载的原因与此问题有关:您的函数updatePointer
修改其输入,而不是返回更新的值,但原理类似。 C风格的单机版strchr
允许你在没有强制转换的情况下将指向const的指针“洗”到指向非const的指针中,这是const系统中的一个漏洞。 C++(a)有重载和(b)有比C更严格的类型系统,所以它关闭了这个漏洞。
如果你希望你的真正功能updatePointer
像strchr
工作 - 检查所指向的数据和计算新的价值,为指针,那么你在同样的情况是strchr
是。这与新值无关(在strchr
的情况下返回,在updatePointer
的情况下将其重新写回),因为问题是您希望新指针与输入具有相同的常量限定。您需要提供常量和非常量重载或函数模板。
如果您只需要实际功能updatePointer
将指针移动一定的距离,无论指向哪个数据,都可以使用std::advance
代替。
我觉得你不能得到const的非const引用 – Yola
我决定删除我的答案,因为我不确定你在问什么。 –
我基本上问为什么不会上面的代码编译 – Fenster34