在C++ 11中使用auto

45 c++ auto 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;
}
Run Code Online (Sandbox Code Playgroud)

在编译和执行之后,我们可以发现结果*p1*p2是相同的,都是100.这意味着p1并且p2都是指向对象的指针int对象.

[user@host ~]$ ./test 
100 100
Run Code Online (Sandbox Code Playgroud)

有没有哪个定义这两个语句之间有什么区别p1p2

nh_*_*nh_ 84

不同的是,在第一种情况下自动被推断为int*,而在第二种情况下自动被推断为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);
}
Run Code Online (Sandbox Code Playgroud)

其中两个函数都被实例化为类型void(int*)但在第一种情况下T被推导为int*在第二种情况下T具有类型int.

  • upvoted用于布置等效的模板实例化 (8认同)

101*_*010 19

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**,如您所料.

  • 差异是由于大括号初始化列表:auto x = {1,2,3}.引自Scott Meyers的书(Effective modern c ++):"自动类型推导通常与模板类型推导相同,但自动类型推导假定支撑初始化器表示std :: initializer_list,而模板类型推导不表示." (3认同)
  • 提及模板参数推断规则的+1.但是,作为一个注释,"auto"类型推导与模板类型推导有一点不同(参见Meyers的Effective Modern C++),尽管我不记得细节. (2认同)