从常量引用初始化非常量引用
Initialization of non constant reference from a constant reference
int main(){
int x = 10;
const int&z = x;
int &y = z; // why is this ill formed?
}
为什么将int的非常量引用初始化为常量引用不正确?这背后的原因是什么?
好吧,为什么它不应该是格式错误的?
它是不正规的,因为它打破了常量更正的明显规则。在C++语言中,不允许将常量访问传递隐式转换为非常量访问路径。指针和引用也是如此。这就是拥有恒定访问路径的全部目的:防止修改路径导致的对象。一旦您将其设置为恒定,就不允许返回到非恒定,除非您通过使用const_cast
做出明确和有意识的努力。
在这种特殊情况下,您可以通过使用const_cast
(这就是const_cast
的作用(轻松地从访问路径中删除常量,并合法地修改引用的对象,因为引用的对象并不是真正的常量
int main(){
int x = 10;
const int &z = x;
int &y = const_cast<int &>(z);
y = 42; // modifies x
}
由于y
不是const
,因此您也可以编写y = 42
并更改z
(即const
(。
因为常量引用是不可修改的,而标准引用是.
编译器假设const int&是const int,尽管在本例中它不是。不能使非常量引用引用const int,因为这样就可以通过引用更改(名义上(const int。
因为
int const x = 10;
int const& z = x;
int& y = z;
y = 42;
将修改常量变量。
正如其他人所说,它将允许间接更改x
,这打破了常量正确性的承诺。看见http://en.wikipedia.org/wiki/Const_correctness
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 通过常量引用传递参数的矩阵模板类
- 在C++中使用非常量引用作为常量
- 具有常量引用参数的函数模板专用化
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 为什么常量方法可以采用非常量引用?
- 为什么当我们有常量引用时创建临时对象?
- 如何返回向量的常量引用?
- C++:常量引用参数
- 不同于按值传递和常量引用传递的程序集
- 为什么const_cast和static_cast常量引用没有效果?
- C++ 获取函数在常量引用中按值返回的结果
- 从 BubbleSort* 类型的右值初始化 'AssortedSorter&' 类型的非常量引用无效"
- C++ 在类中使用常量引用文本时 O2 内存泄漏
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 通过非常量引用参数修改常量引用参数
- 将常量引用传递给线程
- 为什么C++中没有常量引用,就像常量指针一样?