C++ std::variant和std::visit:错误:没有名为'的成员;毫无价值的例外';

C++ std::variant和std::visit:错误:没有名为'的成员;毫无价值的例外';,c++,c++17,variant,C++,C++17,Variant,我有以下代码块: std::visit([&](auto &&arg) { using T = std::decay_t<decltype(arg)>; if constexpr ( std::is_same_v<T, size_t> || std::is_same_v<T, int> || std::is_same_v<T, double> ||

我有以下代码块:

std::visit([&](auto &&arg)
{
    using T = std::decay_t<decltype(arg)>;

    if constexpr (
        std::is_same_v<T, size_t> ||
        std::is_same_v<T, int> ||
        std::is_same_v<T, double> ||
        std::is_same_v<T, bool>
    ) {
        document->AddMember(value.first.c_str(), arg, allocator);
    }
    else if constexpr (std::is_same_v<T, std::string>){
        document->AddMember(
            rapidjson::StringRef(value.first.c_str()),
            rapidjson::StringRef(arg.c_str()),
            allocator
        );
    }
    else if constexpr (std::is_same_v<T, std::shared_ptr<Serializable>>) {
        // TODO
    }
    else if constexpr (std::is_same_v<T, std::vector<std::string>>) {
        for (const auto &strVal: arg) {
            // TODO
        }
    }
    else if constexpr (std::is_same_v<T, std::vector<std::shared_ptr<Serializable>>>) {
        for (const auto &strVal: arg) {
            // TODO
        }
    }
    else {
        throw UndefinedException("Invalid type encountered in instance of serial::Serializable");
    }
}, value);
std::访问([&](自动和参数)
{
使用T=std::decation\u T;
if constexpr(
std::是相同的吗||
std::是相同的吗||
std::是相同的吗||
std::是相同的吗
) {
document->AddMember(value.first.c_str(),arg,分配器);
}
否则,如果constexpr(std::is_same_v){
文档->添加成员(
rapidjson::StringRef(value.first.c_str()),
rapidjson::StringRef(arg.c_str()),
分配器
);
}
否则,如果constexpr(std::is_same_v){
//待办事项
}
否则,如果constexpr(std::is_same_v){
用于(常量自动和字符串:arg){
//待办事项
}
}
否则,如果constexpr(std::is_same_v){
用于(常量自动和字符串:arg){
//待办事项
}
}
否则{
抛出UndefinedException(“serial::Serializable实例中遇到无效类型”);
}
},价值);
当我试图编译它时,我得到以下错误:

/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/variant:1651:23: error: no member named 'valueless_by_exception' in 'std::pair<const std::__cxx11::basic_string<char>, std::variant<unsigned long, int, double, bool, std::__cxx11::basic_string<char>, std::shared_ptr<trogdor::serial::Serializable>, std::vector<std::__cxx11::basic_string<char>, std::allocator<std::__cxx11::basic_string<char> > >, std::vector<std::shared_ptr<trogdor::serial::Serializable>, std::allocator<std::shared_ptr<trogdor::serial::Serializable> > > > >'
      if ((__variants.valueless_by_exception() || ...))
/usr/bin/./lib/gcc/x86\u 64-linux-gnu/9/../../../../../../include/c++/9/variant:1651:23:错误:“std::pair”中没有名为“valueless”的成员
if((uu变体.无值_by_异常()| |…)

我很难弄清楚这意味着什么或者如何解决它。有人能帮我理解发生了什么以及我如何修改代码使其编译吗?

std::visit(
value
)的参数应该是
std::variant
s,但似乎是
std::pair

例如:

#include <string>
#include <utility>
#include <variant>

int main () {
    std::variant<std::string> foo;

    std::visit([](auto&&){}, foo);   // OK

    std::pair<std::string, std::variant<std::string>> bar;

    std::visit([](auto&&){}, bar);   // same error as you have
}
这可能有助于:
std::visit([&](auto&& arg) {
    // ....
}, value.second);