簡體   English   中英

堆棧損壞“重載”std :: visit和MSVC調試器的結構

[英]Stack corruption “overloaded” struct for std::visit and MSVC debugger

我正在討論std :: visitcppreference.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM