【问题标题】:C++11 auto and size_typeC++11 自动和 size_type
【发布时间】:2012-03-27 23:08:38
【问题描述】:

鉴于auto的以下用法:

std::vector<int> v;
for (auto i = 0; i < v.size(); ++i) {
   ...
}

C++ 将i 推导出为std::vector&lt;int&gt;::size_type 是理想的,但如果它只查看i 的初始值设定项,它会看到一个整数。在这种情况下,i 的推断类型是什么? auto 的用法合适吗?

【问题讨论】:

  • 不知道你用i做什么,这是不可能的。
  • 我从来不知道auto是用来推导变量的适当类型的!是吗?
  • @Mr.TAMER 是的,他们在 C++11 中改变了它的含义。
  • @MarkB:太好了!!所以它现在类似于 C# 中的var,对吗?您能否提及标准中定义新含义的部分?
  • @Mr.TAMER [dcl.spec.auto],是的,它几乎与 C# 的 var 关键字相同。

标签: c++ c++11 auto


【解决方案1】:

使用decltype 而不是auto 来声明i

for( decltype(v.size()) i = 0; i < v.size(); ++i ) {
  // ...
}

更好的是,使用迭代器来迭代向量,正如@MarkB 的回答所示。

【讨论】:

  • 或者更好的是,使用基于范围的 for 循环,如下面的回答。
【解决方案2】:

为什么不用迭代器来解决您的问题?然后问题就消失了:

std::vector<int> v;
for (auto i = v.begin(); i != v.end(); ++i) {
   ...
}

如果您想使用索引进行迭代,我可能会明确说明类型:您知道它是什么。 auto 主要用于我认为未知或难以键入的模板类型。

【讨论】:

  • 应该是 begin(v) 和 end(v)
【解决方案3】:

您的问题“汽车的这种用法合适吗?”的答案不是因为其他答案中解释的原因。对于循环遍历容器内容的特殊情况,您最好使用基于范围的 for 循环:

对元素的const引用访问,iconst int&amp;

std::vector<int> v;
for (const auto& i :  v ) {
   std::cout << i << "\n";
}

非 const 引用访问,iint&amp;

std::vector<int> v;
for (auto& i :  v ) {
   ++i;
   std::cout << i << "\n";
}

值访问,iint

std::vector<int> v;
for (auto i :  v ) {
   ...
}

等等。这也适用于 C 风格的数组。

【讨论】:

    【解决方案4】:

    auto 仅从初始化程序中获取类型。没有注意其他用途,至少不用于确定变量的类型。考虑到这一点,decltype 也是一个选项:

    for (decltype(v.size()) i = 0; i < v.size(); ++i)
    

    或者,您可以重写循环以倒退:

    for (auto i = v.size(); i-- != 0; )
    

    或者,您可以完全避免 for 循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-11
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 2012-08-08
      • 1970-01-01
      相关资源
      最近更新 更多