Nik*_*s R 19 c++ gcc for-loop visual-c++ c++11
在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;
}
Run Code Online (Sandbox Code Playgroud)
GCC-5.1自动引入一个新变量或将其设置回初始值,给出
:2
:43
:99
-50
我想MSVC再次成为MSVC,但是GCC在这里呢?为什么last不在99最后一行?
{
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
Run Code Online (Sandbox Code Playgroud)
range_declaration是last和否int last,这应该修改现有的变量.
您的代码无法从gcc 6.1(以及所有clang版本)开始编译:
main.cpp:12:8: error: range-based for loop requires type for loop variable
for (last : v)
^
auto &&
Run Code Online (Sandbox Code Playgroud)
它看起来像以前的版本在这里隐式使用auto.你得到-50作为最后一个输出的事实是因为for引入了最后的局部范围,所以在for结束之后,使用了从外部范围的最后一个.
我做了一点挖掘,这是故意在gcc:N3994,terse range-for,其中很快就会做到:
A range-based for statement of the form
for ( for-range-identifier : for-range-initializer ) statement
is equivalent to
for ( auto&& for-range-identifier : for-range-initializer ) statement
Run Code Online (Sandbox Code Playgroud)
然后它没有进入c ++ 17并在此处删除:
https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=229632