[英]Stack corruption “overloaded” struct for std::visit and MSVC debugger
我正在討論std :: visit的cppreference.com頁面中的代碼,並在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};
是第一個導致未定義行為的代碼示例和/或我是否遇到編譯器錯誤?
事實證明這個代碼應該工作,我遇到了一個Visual Studio錯誤 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.