我在玩cppreference.com page for 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};
第一个代码示例是否导致未定义的行为,并且/或者我是否遇到编译器错误?