Я играл с кодом на странице 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};
Не приводит ли первый пример кода к неопределенному поведению и / или я сталкиваюсь с ошибкой компилятора?