C++:从类型"int*"的表达式初始化类型"const int*&"的引用无效
c++: invalid initialization of reference of type 'const int*&' from expression of type 'int*'
int *b = new int();
const int *&a = b;
IDE 显示"从类型 int*
的表达式初始化类型 const int*&
的引用无效"
我不明白。
不能绑定不同类型的引用;在这种情况下,它们是int *
和const int*
的。
对于const int *&a = b;
,b
是一个int*
,然后首先需要转换为const int*
。这里允许隐式转换,但转换后的const int*
是临时的,不能绑定到a
;因为它是对非常量量的左值引用。
另一方面,临时对象可以绑定到常量或右值引用的左值引用,即
const int * const &a = b; // fine, and the lifetime of the temporary is extended to match the lifetime of the reference a
注意 const
的位置,现在a
被声明为对 const 指针的左值引用 const 指向 const int。
-
b
是指向 int 的指针。 -
a
是对指向 const int 的指针的引用。
所以b
不能分配给a
.
您可能希望引用指向 int 的 const 指针:
int *b = new int();
int *const &a = b;
正式原因是int*
和const int*
是不同的类型,并且转换会创建一个临时引用,并且您不能将非常量引用绑定到临时引用。
使它成为对常量指针的引用将起作用:
const int * const &a = b;
对于一个激励性的例子,让我们假设这是允许的:
int* p = nullptr;
const int*& rp = p;
rp
和p
现在引用同一对象。
让我们做一个const int
.
const int y = 1;
将const int*
分配给const int*
应该是安全的,对吧?
rp = &y;
现在,由于*p
不是常量,我们可以给它分配一个新值:
*p = 0xbaad1dea;
但是p
和rp
是同一个对象,*rp
是y
所以*p
也是y
的,y
是const
现在我们处于不确定行为的领域。
问题是这两种类型
int *
和
const int *
是两种不同的类型。因此,右侧的表达式是变量b
,将转换为类型为 const int *
的rvalue
。
不能将非常量引用绑定到rvalue
。所以你必须写
const int * const &a = b;
相关文章:
- 为什么 int 类型的枚举类值不能用作 int
- 如何将文本文件的特定行读取到 int 类型的数组中C++?
- int* 和 int[] 类型对二进制运算符 + 的操作数无效
- 比较两个整数在C++中与未知 int 类型的相等性
- 二进制'operator+' 'int*'和'int*'类型的无效操作数
- 使用元编程选择 int 类型,将生成错误
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 复制初始化 - 从 'int' 类型转换为非标量类型
- 初始化cv :: mat ::具有int类型的定义大小的人
- 处理代码重新定义int类型(uint16_t,int16_t等),并不喜欢它
- 为什么没有"int"类型声明时输出不同?
- 在大型程序中将长变量更改为 int 类型
- 无法将 int 类型转换为时间类型(我的类类型)
- C++:无法在按位函数后将 int 类型设置为非标量
- 无法分配给INT类型的成员[10]
- C++ cin 将字符串读取到 int 类型中返回 0
- 为什么 decltype((i)) 是引用类型,而 decltype(i+0) 是 int 类型
- 使用4用于循环的4矩阵上的数组下标的“ int [int]类型”
- std::is_arithmetic 为通用 lambda 中的 int 类型返回 false:未定义的行为?
- 正在施放带有“ Int”类型的临时性