std :: visit和MSVC调试器的堆栈损坏“重载”结构

时间:2019-02-13 20:45:58

标签: c++ visual-c++ c++17

我在玩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};

第一个代码示例是否导致未定义的行为,并且/或者我是否遇到编译器错误?

1 个答案:

答案 0 :(得分:0)

事实证明此代码应该可以工作,我遇到了Visual Studio bug