将常量指针引用绑定到非常量指针

问题描述 投票:0回答:3
int val2 = 38;
int *ptr = &val2;
const int *&ptrRef = ptr; // ERROR

int i = 92;
int &ref_i = i;
const int &ref_i2 = ref_i;  // OK

为什么我不能有一个引用非常量指针的常量引用?我认为如果你访问 const

ptrRef
标识符,它会将
val2
视为 const。当您访问
ptr
时,它会将
val2
视为非常量。这适用于代码的底部部分,所以我不明白为什么它不适用于指针。

c++ pointers reference
3个回答
8
投票

East-const 使它更清楚:

int const * & ptrRef = ptr; // ERROR

指针是const。然而,

ptr
是另一种类型。您无法将引用绑定到不同的类型。它需要进行转换,使初始化器成为临时的(
ptr
转换为
int const*
)。

现在,有一个更令人困惑的问题:常量引用可以绑定到临时变量,延长它们的生命周期:为什么常量引用会延长右值的生命周期?

他们例如允许函数通过

const&
接受参数,并且仍然可以使用临时变量调用:

void foo(std::string const&);

foo("foor"s+"bar"s); // still ok

4
投票

我认为,你的问题归结为一个简单的打字错误。如果您想要对非常量指针进行常量引用,请使用以下内容:

int* const&  ptrRef = ptr; // no error

这将 ptrRef 声明为对非常量指针的常量引用。另一个也许更干净的选择是引入 typedef:

 using intptr = int *;
 const intptr& ptrRef = ptr;

此外,您可以完全不用手动指定类型:

const auto&  ptrRef = ptr; // no error

并且,为了更好的衡量,这也可以工作(如在编译中),如果这是你想要的:

const int* const&  ptrRef = ptr; // no error

最新位声明对常量指针的常量引用。


0
投票

其他答案很有帮助,但不完整。 要真正了解影响各种指针/引用指针初始化是否通过不同类型的

const
进行编译的两种或三种不同的 C++ 机制,请参阅此 QA:

初始化/绑定指针和指针引用的“常量正确性”规则是什么?

享受吧!

© www.soinside.com 2019 - 2024. All rights reserved.