【问题标题】:how is auto implemented in C++11自动在 C++11 中是如何实现的
【发布时间】:2012-04-18 07:51:01
【问题描述】:

autoC++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++ 来实现这一点

【问题讨论】:

  • 它把右边的东西的类型放在左边。
  • 它采用与decltype()相同的类型,并使用它而不是auto
  • "我想检查一下如何使用平面 C++ 实现这一点" 如果您的编译器足够新,这纯 C++。也就是说,它是标准化的,因此没有什么特别或与众不同的地方。
  • I want to check how this can be achieved using plane C++ 你不能用“plane C++”“实现”这个;它是 C++11 的语言特性,而 C++03 缺乏。我认为 Boost 有一些宏,但不是那么好。
  • 我认为您对标准术语感到困惑:C++11 是当前的 C++ 标准。 C++03 是过去的 C++ 标准。如果您现在说C++,则与您说C++11 相同。十年后,过去的标准可能是C++11,而现在的标准可能是C++18 左右,你然后会调用C++

标签: c++ c++11


【解决方案1】:

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

auto x = 1;

做与以下类似的事情:

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

function(1);

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

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

【讨论】:

  • 不完全。 decltype(function_that_returns_reference()) 是一些U&amp;,但function(function_that_returns_reference()) 会推导出U,就像auto x = function_that_returns_reference()auto 在模板中为我们提供了 T
  • @R.MartinhoFernandes:是的,有一些细微差别——这就是为什么我说“...大致相同的事情...”和“.. . 一种相同的东西......“。模板比 auto 早几年...
【解决方案2】:

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

auto v = (4+5*2);

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

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];

等等

【讨论】:

  • 那么 v[i] 的类型是什么,其中 v 是标准库容器?我的理解是它是一个左值,因为它通过引用返回。但是表达式的 type 是引用,还是引用被删除了?这与 auto 的行为有关,因为 auto x = v[1] 取值。
  • @juanchopanza 在这种情况下v[i] 的类型是一些T&amp;(或T const&amp;)。 auto x = v[i] 然而,会推断出T,而不是T&amp;。见这里:stackoverflow.com/a/8797915/46642
  • @R.MartinhoFernandes 对,所以 auto 做了一些比仅仅检测表达式类型更复杂的事情。
【解决方案3】:

auto 关键字只是一种声明变量的方法,同时根据值确定变量的类型。

所以你的

auto b = 3.14159;

会知道 b 是双精度数。

有关auto 的更多信息,请查看以下参考资料

C++ Little Wonders: The C++11 auto keyword redux

The C++0x auto keyword

【讨论】:

    【解决方案4】:

    它像以前一样工作:)

    你有没有遇到过编译器错误告诉你:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-06-17
      • 2012-08-15
      • 1970-01-01
      • 2014-08-19
      • 2012-08-06
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      相关资源
      最近更新 更多