【发布时间】: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 上编译(并在
!=始终为真时永远运行)。
标签: c++ visual-studio visual-studio-2017 c++17