【发布时间】:2016-12-01 13:29:40
【问题描述】:
在 C++11 中使用基于范围的 for 循环和现有变量,我希望该变量将填充循环后最后一次迭代的值。但是,当我测试它时,我得到了不同的结果。
例子:
#include <iostream>
#include <vector>
using namespace std;
int main() {
std::vector<int> v;
v.push_back(2);
v.push_back(43);
v.push_back(99);
int last = -50;
for (last : v)
std::cout << ":" << last << "\n";
std::cout << last;
return 0;
}
- MSVC 2013 似乎不支持没有类型声明的基于范围的 for 循环
-
GCC-5.1 要么自动引入一个新变量,要么将其设置回初始值,从而给出
:2
:43
:99
-50
我猜 MSVC 只是再次成为 MSVC,但是这里的 GCC 呢?为什么最后一行不是last99?
鉴于definition by the standard,我预计我在第一句话中描述的行为。
{
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
range_declaration 是 last 而不是 int last,这应该修改现有变量。
【问题讨论】:
-
这还能编译吗?我认为
last位必须是一个声明。 -
啊,这一定是他们先发制人地实现了n3994,它没有进入C++17。
-
@TartanLlama 谢谢,我现在看到选择“
range_declaration"”是有充分理由的。我无法推断它实际上必须是一个声明并且认为它可以是任何可分配的表达式。
标签: c++ c++11 for-loop gcc visual-c++