当我auto
用来推断指针类型时,我发现了一个奇怪的现象.我的代码是这样的:
#include <iostream>
using namespace std;
int main()
{
int i = 100;
auto p1 = &i;
auto *p2 = &i;
cout << *p1 << " " << *p2 << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在编译和执行之后,我们可以发现结果*p1
和*p2
是相同的,都是100.这意味着p1
并且p2
都是指向对象的指针int
对象.
[user@host ~]$ ./test
100 100
Run Code Online (Sandbox Code Playgroud)
有没有哪个定义这两个语句之间有什么区别p1
和p2
?
nh_*_*nh_ 84
不同的是,在第一种情况下自动被推断为int*
,而在第二种情况下自动被推断为int
,这导致两者p1
和p2
为类型int*
.auto的类型推导机制等同于模板参数的类型推导机制.因此,您的示例中的类型推导类似于
template<typename T>
void foo(T p1);
template<typename T>
void bar(T* p2);
int main()
{
int i;
foo(&i);
bar(&i);
}
Run Code Online (Sandbox Code Playgroud)
其中两个函数都被实例化为类型void(int*)但在第一种情况下T
被推导为int*
在第二种情况下T
具有类型int
.
101*_*010 19
auto
在变量声明中使用的说明符,使用与模板参数推导中使用的规则相同的规则推导出它的类型.
考虑你的第一个例子(即auto p1 = &i;
).auto
说明符的类型
推导如下:
auto
被虚构的模板参数替换(例如U p1 = &i;
).&i
类型是int*
,因此没有意外,并根据模板推导规则U
推导int*
.现在考虑你的第二个例子(即auto *p2 = &i
).
auto
用虚构的模板参数(例如U* p1 = &i;
)替换.&i
类型是int*
,因此根据模板推导规则U
推导出来int
.因此,在auto *p2 = &i;
占位符类型auto
中将正确地推断为,int
而不是如此int*
,这将导致p2
类型int**
,如您所料.