如何在 C++11 中自动实现

how is auto implemented in C++11

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

auto如何在C++11中实现?我尝试了以下操作,它可以在C++11

auto a = 1;
// auto = double
auto b = 3.14159;
// auto = vector<wstring>::iterator
vector<wstring> myStrings;
auto c = myStrings.begin();
// auto = vector<vector<char> >::iterator
vector<vector<char> > myCharacterGrid;
auto d = myCharacterGrid.begin();
// auto = (int *)
auto e = new int[5];
// auto = double
auto f = floor(b);

我想检查如何使用普通C++来实现这一点

它的作用与在函数模板中用于类型推断大致相同,例如:

auto x = 1;

做与以下事情相同的事情:

template <class T>
T function(T x) { return input; }
function(1);

编译器必须确定作为参数传递的表达式的类型,并从中实例化具有适当类型的函数模板。如果我们从这个开始,那么decltype基本上给了我们这个模板中T的内容,auto给了我们这个模板中x的内容。

我怀疑与模板类型推断的相似性使委员会更容易接受autodecltype到语言中 - 他们基本上只是添加了访问函数模板已经需要的类型推断的新方法。

在C++中,每个表达式都有类型。例如,(4+5*2) 是一个表达式,其值等于 14,类型为 int 。所以当你写这个的时候:

auto v = (4+5*2);

编译器在右侧检测表达式的类型,并将auto替换为检测到的类型(有一些例外,读取注释),它变为:

int v = (4+5*2); //or simply : int v = 14;

同样地

auto b = 3.14159; //becomes double b = 3.14159;
auto e = new int[5]; //becomes int* e = new int[5];

等等

auto 关键字只是一种声明变量的方法,同时使其类型基于值。

所以你的

auto b = 3.14159;

会知道 b 是双精度。

有关auto的其他阅读,请查看以下参考资料

C++ 小奇迹:C++11 自动关键字 redux

C++0x 自动关键字

它的工作方式与:)之前一样

您是否从未遇到过编译器错误告诉您:

错误:const char*int 的转换无效

对于这样的代码片段:int i = "4";

好吧,auto只是利用编译器知道=符号右侧表达式的类型并重用它来键入您声明的变量这一事实。