【问题标题】:comma operator with c++11 for loop带有c ++ 11 for循环的逗号运算符
【发布时间】:2013-12-02 21:44:44
【问题描述】:

一开始我想试试是否允许这样做:

vector<int> a{1, 2};
vector<int> b{3, 4};

for(auto ai : a, auto bi : b)
{

}

这不起作用,但由于尺寸限制,我期待它。

但是,我很惊讶这也不起作用:

vector<int> b{3, 4};

for(int x = 1, auto bi : b)
{

}

逗号运算符不是要先解决左侧的所有副作用,然后再转到右侧吗?

【问题讨论】:

  • 使用zip boolinq 库的方法:) github.com/k06a/boolinq
  • 逗号运算符与此无关。这是一个声明
  • @k06a 我在您的存储库中没有看到任何 zip 方法。
  • @Arpegius 你是对的。它尚未在 2.0 中实现。我的错...
  • 好吧,我找到了解决方案sequence-zip-function-for-c11

标签: c++ c++11 for-loop foreach comma-operator


【解决方案1】:

逗号运算符是一个运算符。这意味着它只能在表达式中使用。 int x = 1, auto bi : b 绝对不是表达式。所以你不能在那里真正使用它。

它看起来有点像格式错误的声明。格式错误,因为您试图更改声明的类型。

请注意,该语言的语法实际上对: 左侧的部分使用了一个特殊的非终结符for-range-declaration。最终解决为单个声明。所以在基于范围的for循环中声明多个变量是非法的。

【讨论】:

  • 好的,我想知道这种情况的语法中是否有一些特殊的结构!
【解决方案2】:

在第二种情况下,您有一个声明。声明可以包含多个变量的声明,以逗号分隔

你在第二种情况下写的相当于下面的声明

int x = 1, auto bi;

for (...) ...

第一个不起作用的原因不是因为任何大小限制,而是因为 range for loop 的语法根本不允许你做这样的事情。

【讨论】:

  • 好的!但是for(auto ai = a.begin(), bi : b) 应该可以工作吗? (我知道,这很奇怪也很危险!)
  • @Jean-MichaëlCelerier 不,语法也不允许这样做。请点击链接并阅读有关如何实现基于范围的 for 循环的信息,您就会明白为什么。
猜你喜欢
  • 2012-09-18
  • 2019-08-11
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 2016-06-26
  • 2017-07-11
相关资源
最近更新 更多