为什么我的访问者的 std::variant 堆栈损坏

Nic*_*las 7 c++ stack visual-studio visual-c++ c++17

我很难理解这段代码发生了什么:


#include <iostream>
#include <variant>

template <class... Ts>
struct overloaded : Ts... {
    using Ts::operator()...;
};
template <class... Ts>
overloaded(Ts...) -> overloaded<Ts...>;

struct FirstPSet {
    std::uint16_t uid;
};

struct SecondPSet {
    std::uint16_t uid;
};

using PSet = std::variant<std::monostate, FirstPSet, SecondPSet>;

auto getUID(const PSet& pSet) {
    auto visitor = overloaded{[](const std::monostate&) -> std::uint16_t { return 0; },
                              [](const auto& pSet) -> std::uint16_t { return pSet.uid; }};
    return std::visit(visitor, pSet);
}

int main() {
    FirstPSet pSet{42};

    std::cout << getUID(pSet) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

当使用 Visual Studio Community 16.8.2(调试版本)编译时,我在getUID. 如果我修改visitorauto&& visitor = ...,它工作正常。