std::array场景下auto推导为指针还是数组退化的疑问
问题解答
- 这里是
auto直接推导为指针类型,和数组退化没有直接关系。 - 拆解
&data[0]的逻辑:不管data是C风格数组还是std::array,data[0]返回的是数组第一个元素的左值引用,对这个引用取地址&后,得到的就是指向该元素的指针(比如元素是int类型的话,结果就是int*)。auto会根据这个指针值的类型直接推导出对应的指针类型,所以写auto begin{ &data[0] };和auto* begin{ &data[0] };的效果完全一致——前者是auto自动推导为指针类型,后者是显式限定auto推导指针的基类型,最终结果相同。 - 你关于“数组退化仅发生在C风格数组中”的认知是正确的:数组退化特指C风格数组的数组名在特定场景下(比如作为函数参数传递、直接赋值给指针变量时)隐式转换成指向第一个元素的指针;而
std::array是类模板实例,它的名字是对象名,不会发生这种退化。但在这个例子里,我们根本没用到数组名的隐式转换,而是通过[]运算符拿到单个元素再取地址,全程没触发数组退化。
内容的提问来源于stack exchange,提问作者tadm123
相关产品推荐
相关产品推荐

