对指针类型的引用
Reference to Pointer Type
#include <iostream>
using namespace std;
int main(void)
{
int num[5];
const int* &ref = num;
return 0;
}
我读过一本C++书,其中提到了引用变量是否引用:
- 类型不同但可以转换的变量。
- 不是左值的变量。
只要引用变量声明为 const
,上述 2 种情况将使用一种方法来解决,其中编译器将创建一个存储并将值放入其中,同时引用变量的标识符被视为该特定存储位置的标识符。下面是演示代码。
#include <iostream>
using namespace std;
int main(void)
{
int num = 5;
const long long &ref = num; //the value 5 is place in a new storage where ref is the identifier
return 0;
}
案例2: #include <iostream>
using namespace std;
int main(void)
{
int num = 5;
const int &ref = num + 1; //expression num + 1 evaluated and store in new storage with identifier ref
return 0;
}
既然这2个案例是有效的,为什么《守则》里面的案例是无效的呢?
我的逻辑是,因为使用数组的名称将转换为指向数组第一个元素的指针,因此编译器应该发现这不是一个左值,并且将创建一个新的存储来存储该地址,当然,引用变量名称将被视为该位置的标识符。
注意:我知道这有点偏离主题,但我可以知道数组名称是否是Lvalue吗?只需一个简单的是或否就可以了,因为将代码更改为int &ref = num
我认为它不是一个左值,但我只需要进一步确认。
谢谢。
引用变量未声明为常量。
const int *
和int * const
之间是有区别的,你选错了。
您的示例 (ii( 出于同样的原因无效,应该const int &ref = num + 1;
对于您的笔记,我不确定简单的是或否是否可行。简单的数组名称是一个左值,指的是数组。但是,在大多数情况下,它会衰减到指向第一个元素的指针,这是一个右值指针。
相关文章:
- 强制转换为引用类型
- 自定义引用类型
- Java 中是否有类似于 C++ 中引用类型"&"的内容?
- 为什么我不能在运算符=中使用引用类型?
- 可变参数模板函数参数和引用类型推导
- 隐式可转换参数,但属于引用类型
- 如何告诉自动推断向量<bool>元素的非引用类型
- 为什么"const auto [x, y]"绑定到引用类型时没有按预期运行?
- 引用类型的数据成员提供有关恒常正确性"loophole"
- 为什么引用类型在使用临时对象访问时是左值
- 什么是常量指针常量引用类型的参数?(const X* const & p)
- 在 lambda 中从引用类型捕获的值的类型,不使用通用捕获
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- void*作为通用引用类型是如何工作的
- 强制转换为不相关的引用类型是否违反严格的别名规则?
- C++ 引用类型作为递归函数参数
- EXPECT_CALL具有 unique_ptr 引用类型参数的模拟函数
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 为什么模板引用类型不能用作模板类型别名参数?
- 模板默认参数将丢失其引用类型