解除引用的指针或迭代器的类型是什么?
What is the type of derefenced pointer or iterator?
如果我有这样的东西:
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)项here中,但我仍然对xvalue和prvalue[=感到困惑43=].
编辑:原来把我搞糊涂的代码里面肯定有等同于
的东西
const int a = 5;
auto* p = &a;
decltype(*p) b = 1;
并没有意识到 a
是 const
,所以 decltype(*p)
是 const int&
,这就是第三行没问题的原因。
*p
和 *it
都给你一个 int&
,这是对 int
的 lvaue 引用。因为你有一个左值 decltype(lvalue)
给你一个 T&
.
这意味着在两个代码块中 b
是一个 int&
并且代码不会编译,因为您不能将纯右值(1
在这种情况下)绑定到非常量左值参考
如果我有这样的东西:
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)项here中,但我仍然对xvalue和prvalue[=感到困惑43=].
编辑:原来把我搞糊涂的代码里面肯定有等同于
的东西const int a = 5;
auto* p = &a;
decltype(*p) b = 1;
并没有意识到 a
是 const
,所以 decltype(*p)
是 const int&
,这就是第三行没问题的原因。
*p
和 *it
都给你一个 int&
,这是对 int
的 lvaue 引用。因为你有一个左值 decltype(lvalue)
给你一个 T&
.
这意味着在两个代码块中 b
是一个 int&
并且代码不会编译,因为您不能将纯右值(1
在这种情况下)绑定到非常量左值参考