在 C++11 中使用自动

Usage of auto in C++11

本文关键字:C++11      更新时间:2023-10-16

当我使用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类型是int*的,因此没有意外,根据模板演绎规则,U被推导出为int*

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

  1. 再次auto替换为虚构类型模板参数(例如,U* p1 = &i; (。
  2. &i类型是int*,因此根据模板演绎规则U被推导出int

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