Обобщенный диапазон C ++ 17 на основе циклов в Visual Studio - PullRequest
0 голосов
/ 01 мая 2018

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;
    }
}

1 Ответ

0 голосов
/ 01 мая 2018

Проблема заключалась в том, что пока я использовал VS2017, проект все еще был нацелен на VS2015. После ретаргетинга до 2017 года он компилируется нормально.

Спасибо за помощь. Отчеты, которые он собирает в 15.6, заставили меня начать искать другие ответы, как только я обновил до 15.6, и он все еще не компилировался. Спасибо.

...