如何在 C++11 中自动实现
how is auto implemented in C++11
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
的内容。
我怀疑与模板类型推断的相似性使委员会更容易接受auto
并decltype
到语言中 - 他们基本上只是添加了访问函数模板已经需要的类型推断的新方法。
在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
只是利用编译器知道=
符号右侧表达式的类型并重用它来键入您声明的变量这一事实。
相关文章:
- 如何使用lock_guard在c++11中实现scoped_lock功能
- 是否可以仅使用标准 c++/c++11 实现不带"sleep"的计时器?
- 此包络实现是否正确使用 C++11 原子学
- 在 C++11 标准中,为什么要依赖 char 类型实现?
- 树实现给出分段错误(核心转储)错误 c++ 11
- 如何实现声明功能-C 11,编译时间
- 扩展命名空间 std 以在使用 C++11 时实现make_unique
- 我如何实现变异模式以将可变数量的参数转发到C 11中的函数
- 使 c++11 Dijkstra 实现返回最短路径
- 如何通过 C++11 的 CAS 实现瓦卢瓦队列
- 有没有办法在旧版本的 c++ 中实现初始值设定项列表(有点)(在 c++11 之前)
- 在C 11或更高版本中,是否可以通过Lambda来实现单方法纯Virtual C 接口
- 实现功能对象绑定而无需使用C 11
- GCC 4.4 不实现 C++11 范围循环.它还支持哪些其他范围循环语法
- MOV x86指令是否实现C++11 memory_order_release原子存储
- 实现 C++11 委派构造函数功能会导致多个警告
- 在C中实现C++标准11的std::move函数
- 抱歉,未实现:c++ 11中的非静态数据成员初始化器
- 使用boost实现c++ 11 lambda
- libstdc++实现c++ 11 deque接口