"Перегруженная" структура повреждения стека для отладчика std :: visit и MSVC - PullRequest
0 голосов
/ 13 февраля 2019

Я играл с кодом на странице cppreference.com для std :: visit и столкнулся с проблемой в отладочных сборках Visual Studio 2017 (15.9.6 и 15.9.7) (обе x86и x64, с отладчиком, подключенным к процессу или без него), используя следующий код:

#include <iostream>

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...)->overloaded<Ts...>;

int main()
{
    auto op = overloaded{
        [](int x) { std::cout << "Got int: " << x << '\n'; },
        [](const char* s) { std::cout << "Got cstring: " << s << '\n'; }
    };

    op(4);
    op("Hello");
}

При выходе из функции программа завершается с сообщением «Ошибка проверки времени выполнения № 2 - Стеки вокругпеременная 'op' была повреждена. "

В сборках выпуска эта ошибка не выдается, и когда я скомпилировал ее под g ++ и clang ++, я не столкнулся с проблемой.

Я также отмечаю, чтоустановка op следующим образом решает проблему:

auto l1 = [](int x) { std::cout << "Got int: " << x << '\n'; };
auto l2 = [](const char* s) { std::cout << "Got cstring: " << s << '\n'; };

auto op = overloaded{l1, l2};

Не приводит ли первый пример кода к неопределенному поведению и / или я сталкиваюсь с ошибкой компилятора?

1 Ответ

0 голосов
/ 18 февраля 2019

Оказывается, этот код должен работать, и я столкнулся с Visual Studio ошибка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...