Visual Studio 中基于 For 循环的 C++17 广义范围

Posted

技术标签:

【中文标题】Visual Studio 中基于 For 循环的 C++17 广义范围【英文标题】:C++17 Generalized Range Based For Loops in Visual Studio 【发布时间】:2018-05-01 18:06:36 【问题描述】:

Visual Studio 2017 声称它们支持基于 C++17 范围的 for 循环。但是,当我尝试编译时,我收到错误,表明它使用的是 C++11 样式。有没有人设法让哨兵循环在 VS 2017 中工作?

这是一些示例代码。我已经删除了这段代码以使其简短,所以它显然不能正常工作,但它应该可以编译。

struct MyExampleIterator

    int operator*() const  return 0; 

    MyExampleIterator& operator++()  return *this; 
;

class MyExampleSentinel ;

bool operator!=(const MyExampleIterator& a, const MyExampleSentinel& b)  return true; 

struct MyExampleRange

    MyExampleIterator begin()  return MyExampleIterator(); 
    MyExampleSentinel end()  return MyExampleSentinel(); 
;

如果我尝试在 VS2017 (15.2) 中基于 for 循环的范围内使用此类,我会得到 error C3538: in a declarator-list 'auto' must always deduce to the same type

MyExampleRange range;
for (auto i : range)  // error C3538

但如果我手动构建 C++17 标准代码,它编译得很好:

// Compiles fine
MyExampleRange range;

    auto && __range = range;
    auto __begin = __range.begin();
    auto __end = __range.end();
    for (; __begin != __end; ++__begin) 
        auto i = *__begin;
    

【问题讨论】:

您的示例可以在 Godbolt 上的任何版本上为我编译(19.10.25017?)所以也许 15.2 还不够新? 目前无法测试,但当前是 15.6.x,而不是 15.2,因此它可能已在某个服务版本中得到修复。 在 15.6.7 上编译(并在 != 始终为真时永远运行)。 【参考方案1】:

问题是,当我使用 VS2017 时,该项目仍然针对 VS2015。重新定位到 2017 年之后,它编译得很好。

感谢您的帮助。一旦我更新到 15.6,它在 15.6 中编译的报告让我开始挖掘其他答案,但它仍然没有编译。谢谢。

【讨论】:

以上是关于Visual Studio 中基于 For 循环的 C++17 广义范围的主要内容,如果未能解决你的问题,请参考以下文章

visual studio 2019怎么用for循环语句实现九九乘法表

Visual Studio 2010 自动完成for的快捷键是?

c++环境下,怎样用Visual Studio调试循环

Visual Studio 2015 缩进多行 for 语句

Visual Studio 2017 循环自动矢量化问题

求大神,求解,谢谢。用visual studio 2010利用FOR循环显示下拉框中的年月日,要求能对闰年作出判断.