为何decltype(arr[5])是int&而非int?结合C++标准解析矛盾
问题解答
核心原因是**decltype的推导规则和表达式的「值类别」直接绑定**,你误解了它对左值表达式的推导逻辑。
结合你引用的标准条款一步步拆解:
- 对于数组左值
arr,arr[5]等价于*((arr)+5)。arr作为左值数组,会自动转换为指向首元素的指针纯右值(int*),加5后仍是int*纯右值。 - 根据一元
*的条款,对int*纯右值做间接寻址,得到的是**int类型的左值**——这里的“T类型左值”指的是表达式本身是左值(代表可被取地址的对象),而非纯右值。 - 而
decltype的规则很明确:如果操作数是左值表达式,推导结果就是对应类型的左值引用。所以decltype(arr[5])最终是int&,而非你预期的int。
你之前的误区在于混淆了“表达式的基础类型”和decltype的推导结果:arr[5]的基础类型是int,但它的值类别是左值,decltype会根据值类别为结果追加引用修饰。
内容的提问来源于stack exchange,提问作者Oersted
相关产品推荐
相关产品推荐

