从我用来学习c++的所有材料来看,auto一直是一个奇怪的存储持续时间指示符,没有任何用处。但就在最近,我遇到了一些代码,它们将它本身用作类型名。出于好奇,我尝试了一下,它假设我分配给它的任何类型!

突然间,STL迭代器,以及任何使用模板的东西都变得容易了10倍。感觉我在使用一种“有趣”的语言,比如Python。

这个关键字在我的生活中哪里呢?你会说这是visual studio独有的或者不能携带的,这会让我的梦想破灭吗?


当前回答

它的神奇之处在于它能够减少为传递到特定函数的每个变量类型编写代码。考虑Python中类似的print()函数。

#include <iostream>
#include <string>
#include <array>

using namespace std;

void print(auto arg) {
     cout<<arg<<" ";
}

int main()
{
  string f = "String";//tok assigned
  int x = 998;
  double a = 4.785;
  string b = "C++ Auto !";
//In an opt-code ASCII token stream would be iterated from tok's as:
  print(a);
  print(b);
  print(x);
  print(f);
}

其他回答

这种功能并不是你一生中就有的。自2010年版本以来,Visual Studio一直支持它。它是c++ 11的一个新特性,所以它不是Visual Studio独有的,并且是可移植的。大多数编译器已经支持它了。

它只是采用一个通常无用的关键字,并赋予它一个新的、更好的功能。它是c++ 11中的标准,大多数c++编译器甚至有一些c++ 11支持都会支持它。

它的神奇之处在于它能够减少为传递到特定函数的每个变量类型编写代码。考虑Python中类似的print()函数。

#include <iostream>
#include <string>
#include <array>

using namespace std;

void print(auto arg) {
     cout<<arg<<" ";
}

int main()
{
  string f = "String";//tok assigned
  int x = 998;
  double a = 4.785;
  string b = "C++ Auto !";
//In an opt-code ASCII token stream would be iterated from tok's as:
  print(a);
  print(b);
  print(x);
  print(f);
}

它不会去任何地方……它是c++ 11实现中的一个新的标准c++特性。也就是说,虽然它是一个简化对象声明以及清理某些调用范式(即基于范围的for循环)语法的好工具,但不要过度使用/滥用它:-)

auto关键字是c++中一个重要且常用的关键字。在初始化变量时,auto关键字用于类型推断(也称为类型推断)。

关于auto关键字有3条不同的规则。

第一条规则

Auto x = expr;---->没有指针或引用,只有变量名。在这种情况下,const和reference将被忽略。

int  y = 10;
int& r = y;
auto x = r; // The type of variable x is int. (Reference Ignored)

const int y = 10;
auto x = y; // The type of variable x is int. (Const Ignored)

int y = 10;
const int& r = y;
auto x = r; // The type of variable x is int. (Both const and reference Ignored)

const int a[10] = {};
auto x = a; //  x is const int *. (Array to pointer conversion)

Note : When the name defined by auto is given a value with the name of a function,
       the type inference will be done as a function pointer.

第二条规则

Auto& y = expr;或auto* y = expr;----> auto关键字后的引用或指针。

警告:const在此规则中不会被忽略!!.

int y = 10;
auto& x = y; // The type of variable x is int&.

警告:在此规则中,数组到指针的转换(数组衰减)不会发生!!

auto& x = "hello"; // The type of variable x is  const char [6].

static int x = 10;
auto y = x; // The variable y is not static.Because the static keyword is not a type. specifier 
            // The type of variable x is int.

第三条规则

Auto&& z = expr;---->不是右值引用。

警告:如果存在类型推断问题,并且使用了&&标记,则名称 像这样引入的被称为“转发引用”(也称为通用引用)。

auto&& r1 = x; // The type of variable r1 is int&.Because x is Lvalue expression. 

auto&& r2 = x+y; // The type of variable r2 is int&&.Because x+y is PRvalue expression.