在C ++中使用auto 11
当我使用auto
来推断一个指针types时,我发现了一个奇怪的现象。 我的代码是这样的:
#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*
types。 auto的types演绎机制等同于模板参数的types演绎机制。 你的例子中的types扣除因此类似于
template<typename T> void foo(T p1); template<typename T> void bar(T* p2); int main() { int i; foo(&i); bar(&i); }
其中两个函数被实例化为void(int *)types,但是在第一种情况下, T
被推导为int*
而在第二种情况下, T
types为int
。
在variables声明中使用的auto
指定符,使用与在模板参数推导中使用的规则相同的规则推导其types。
考虑你的第一个例子(即, auto p1 = &i;
)。 auto
说明符的types推导如下:
-
auto
用一个虚构的types模板参数(例如U p1 = &i;
)replace。 -
&i
types是int*
,因此没有意外,根据模板推导规则U
推导为int*
。
现在考虑你的第二个例子(即auto *p2 = &i
)。
- 同样,
auto
被replace为一个虚构的types模板参数(例如,U* p1 = &i;
)。 -
&i
types是int*
,因此根据模板演绎规则U
推导为int
。
因此,在auto *p2 = &i;
占位符typesauto
将被正确地推导为int
而不是int*
,这将导致p2
的types为int**
,正如您所预料的那样。