解除引用的指针或迭代器的类型是什么?

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中,但我仍然对xvalueprvalue[=感到困惑43=].

编辑:原来把我搞糊涂的代码里面肯定有等同于

的东西
const int a = 5;
auto* p = &a;
decltype(*p) b = 1;

并没有意识到 aconst,所以 decltype(*p)const int&,这就是第三行没问题的原因。

*p*it 都给你一个 int&,这是对 int 的 lvaue 引用。因为你有一个左值 decltype(lvalue) 给你一个 T&.

这意味着在两个代码块中 b 是一个 int& 并且代码不会编译,因为您不能将纯右值(1 在这种情况下)绑定到非常量左值参考