std::visit 和 MSVC 调试器的堆栈损坏“重载”结构
Posted
技术标签:
【中文标题】std::visit 和 MSVC 调试器的堆栈损坏“重载”结构【英文标题】:Stack corruption "overloaded" struct for std::visit and MSVC debugger 【发布时间】:2019-02-13 20:45:58 【问题描述】:我正在使用 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 = overloadedl1, l2;
第一个代码示例是否会导致未定义的行为和/或我是否遇到了编译器错误?
【问题讨论】:
使用 MSVC 提交错误 【参考方案1】:事实证明这段代码应该可以工作,我遇到了Visual Studio bug。
【讨论】:
以上是关于std::visit 和 MSVC 调试器的堆栈损坏“重载”结构的主要内容,如果未能解决你的问题,请参考以下文章