当我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**,如您所料.
| 归档时间: |
|
| 查看次数: |
3000 次 |
| 最近记录: |