[英]Usage of auto in C++11
当我使用auto
来推断指针类型时,我发现了一个奇怪的现象。 我的代码是这样的:
#include <iostream>
using namespace std;
int main()
{
int i = 100;
auto p1 = &i;
auto *p2 = &i;
cout << *p1 << " " << *p2 << endl;
return 0;
}
在编译和执行之后,我们可以发现*p1
和*p2
的结果是相同的,都是100.这意味着p1
和p2
都是指向int
对象的指针对象。
[user@host ~]$ ./test
100 100
这两个定义p1
和p2
语句之间有什么区别吗?
不同之处在于,在第一种情况下,auto被推导为int*
而在第二种情况下,auto被推导为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);
}
其中两个函数都被实例化为void(int *)类型,但在第一种情况下, T
被推导为int*
而在第二种情况下, T
具有int
类型。
在变量声明中使用的auto
说明符,使用与模板参数推导中使用的规则相同的规则推导出它的类型。
考虑你的第一个例子(即auto p1 = &i;
)。 auto
说明符的类型推导如下:
auto
被替换为虚构类型模板参数(例如, U p1 = &i;
)。 &i
type是int*
,因此没有任何意外,根据模板推导规则, U
被推导为int*
。 现在考虑你的第二个例子(即auto *p2 = &i
)。
auto
(例如, U* p1 = &i;
)。 &i
type为int*
,因此根据模板推导规则U
推导为int
。 因此,在auto *p2 = &i;
占位符类型auto
将正确地推导为int
而不是int*
,这将导致p2
的类型为int**
,正如您可能预期的那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.