如果我有这样的东西:
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 感到困惑。
编辑:在使我感到困惑的原始代码中,我一定有等同于
的内容const int a = 5;
auto* p = &a;
decltype(*p) b = 1;
并且没有意识到a
是const
,所以decltype(*p)
是const int&
,这就是第三行很好的原因。
答案 0 :(得分:2)
*p
和*it
都给您一个int&
,这是对int
的简单引用。由于您拥有左值decltype(lvalue)
会给您T&
。
这意味着在两个代码块中b
都是int&
,并且由于无法将prvalue(在这种情况下为1
)绑定到非常量左值引用,因此代码无法编译< / p>