静态断言失败:变体必须没有参考替代

Al *_*ndy 2 c++ c++17

我想要一个包含对不同类型变量的引用的映射。为此,我使用std::variant这样的:

using foo = std::variant<std::atomic<double> &, std::atomic<int> &, std::string &>;
Run Code Online (Sandbox Code Playgroud)

使用 gcc 7.3.0 编译到此为止。使用的编译器标志:-Wall -Wextra -Werror -O3 -std=c++17

添加此代码:

using ServerParameter = struct ServerParameter
{
    foo  myVariants;     <---- gcc error
    bool someLogic;
};
Run Code Online (Sandbox Code Playgroud)

破坏代码,我收到此 gcc 错误:

错误:静态断言失败:变体必须没有参考替代方案

我的意图是这样的 - 但目前我不能,因为usingforServerParameter已经失败了:

auto bar() -> void
{    
    std::atomic<double> atom_double;
    std::atomic<int>    atom_int;
    std::string         myString;
    ...
    std::map<std::string, ServerParameter> variableList(
        {
            { {"SomeText1" }, { atom_double; true  } },
            { {"SomeText2" }, { atom_int;    true  } },
            { {"SomeText3" }, { myString;    false } },
        }
    );
    ...
}
Run Code Online (Sandbox Code Playgroud)

variableList然后,我可以根据引用的类型很好地处理 中的项目std::visit


笔记:

pointer 代替, eq起作用reference

using foo = std::variant<std::atomic<double> *, std::atomic<int> *, std::string *>;

auto bar() -> void
{    
    std::atomic<double> atom_double;
    std::atomic<int>    atom_int;
    std::string         myString;
    ...
    std::map<std::string, ServerParameter> variableList(
        {
            { {"SomeText1" }, { &atom_double; true  } },
            { {"SomeText2" }, { &atom_int;    true  } },
            { {"SomeText3" }, { &myString;    false } },
        }
    );
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后是非常优雅的std::visit

std::visit( visitHandler             
        {
            [&](std::atomic<double> * enumType) { *enumType = ..an assignment..; },
            [&](std::atomic<int> * enumType)    { *enumType = ..an assignment..; },
            [&](FaF::string * enumType)         { *enumType = ..an assignment..; },
        }, variantEntry );
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 我在这里做错了什么?我不明白错误消息,并且我在网上没有找到任何内容。
  2. 正确的声明是什么ServerParameter