繁体   English   中英

在C ++ 11中使用auto

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

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

这两个定义p1p2语句之间有什么区别吗?

不同之处在于,在第一种情况下,auto被推导为int*而在第二种情况下,auto被推导为int ,这导致p1p2都是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说明符的类型推导如下:

  1. auto被替换为虚构类型模板参数(例如, U p1 = &i; )。
  2. &i type是int* ,因此没有任何意外,根据模板推导规则, U被推导为int*

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

  1. 再次用假想的类型模板参数替换auto (例如, U* p1 = &i; )。
  2. &i type为int* ,因此根据模板推导规则U推导为int

因此,在auto *p2 = &i; 占位符类型auto将正确地推导为int而不是int* ,这将导致p2的类型为int** ,正如您可能预期的那样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM