Visual Studio 2017 заявляет, что они поддерживают диапазон C ++ 17 для циклов. Однако, когда я пытаюсь скомпилировать, я получаю ошибки, указывающие, что он использует стиль 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), я получу 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;
}
}