在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.这意味着p1p2都是指向int对象的指针对象。

 [user@host ~]$ ./test 100 100 

这两个定义p1p2语句是否有区别?

不同的是,在第一种情况下,auto被推导为int*而在第二种情况下,auto被推断为int ,这导致p1p2都是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*而在第二种情况下, Ttypes为int

在variables声明中使用的auto指定符,使用与在模板参数推导中使用的规则相同的规则推导其types。

考虑你的第一个例子(即, auto p1 = &i; )。 auto说明符的types推导如下:

  1. auto用一个虚构的types模板参数(例如U p1 = &i; )replace。
  2. &itypes是int* ,因此没有意外,根据模板推导规则U推导为int*

现在考虑你的第二个例子(即auto *p2 = &i )。

  1. 同样, auto被replace为一个虚构的types模板参数(例如, U* p1 = &i; )。
  2. &itypes是int* ,因此根据模板演绎规则U推导为int

因此,在auto *p2 = &i; 占位符typesauto将被正确地推导为int而不是int* ,这将导致p2的types为int** ,正如您所预料的那样。