c++ - 解除引用的指针或迭代器的类型是什么?
问题描述
如果我有这样的事情:
int a = 5;
auto* p = &a;
decltype(*p) b = 1;
我猜那decltype(*p)
是int
而不是int&
或const int&
。
但是那么如何取消引用迭代器,例如
std::vector<int> a { 5 };
auto it = a.begin();
decltype(*it) b = 1;
是decltype(*it)
int
吗?但不是类型*it
int&
吗?
我怀疑答案包含在第 (4) 项中,但我仍然对xvalue和prvalue感到困惑。
编辑:在让我感到困惑的原始代码中,我一定有相当于
const int a = 5;
auto* p = &a;
decltype(*p) b = 1;
并没有意识到那a
是const
,所以decltype(*p)
是const int&
,这就是为什么第三行很好。
解决方案
两者都给你一个*p
,它是一个对 的 lvaue 引用。因为你有一个左值给你一个.*it
int&
int
decltype(lvalue)
T&
这意味着在两个代码块b
中都是一个int&
并且代码不会编译,因为您不能将prvalue(1
在这种情况下)绑定到非常量左值引用
推荐阅读
- python - 蒙蒂霍尔模拟:为什么我的代码的这两个版本给出不同的输出?
- html - 格式化带有列的项目列表
- c# - 参数不起作用,这里有什么问题
- logparser - 使用 logparser 解析特定年龄的文件
- c# - NUnit Assert.AreEqual(LeftObject,RigtObject)
- c - C - 如何在 getopts 中读取多个参数?
- python - 在 Python 中重新映射 OpenCV 中的像素值的最快方法是什么?
- error-handling - 如何使用自定义结构实现错误
- android - 显示当前用户详细信息(例如名称) - Bloc flutter
- sql - 如何格式化 TRUNC?