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
视为非常量。这适用于代码的底部部分,所以我不明白为什么它不适用于指针。
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
我认为,你的问题归结为一个简单的打字错误。如果您想要对非常量指针进行常量引用,请使用以下内容:
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
最新位声明对常量指针的常量引用。
其他答案很有帮助,但不完整。 要真正了解影响各种指针/引用指针初始化是否通过不同类型的
const
进行编译的两种或三种不同的 C++ 机制,请参阅此 QA:
享受吧!