c++ - 如何初始化这个具有两个类似替代方案的 std::variant 数据成员?

标签 c++ initialization variant std-variant

以下代码无法编译。为什么会有这个限制,我该如何绕过它?如果我替换变体声明,它就会编译。

struct PPP
{
    int xxx;
    PPP() : x(xxx) {} // error: No matching constructor for initialization of 'std::variant<Inner1, Inner2>'

    struct Inner1
    {
        Inner1(int &x )  : c(x) {}
        int &c;
    };
    struct Inner2
    {
        Inner2(int &x )  : c(x) {}
        int &c;
    };
    struct Inner3 {};

    std::variant<Inner1, Inner2> x;
    // std::variant<Inner1, Inner3> x; // This will cause the code to compile
};

最佳答案

xxx成员(member)是 int .

Inner1Inner2两者都可以从(引用)int 构造。 ,所以x(xxx) std::variant<Inner1, Inner2> 不明确因为编译器不知道您要在 std::variant 内构造哪种类型.

当您使用std::variant<Inner1, Inner3>时相反,自 Inner3 以来没有任何歧义。不能从 int 构建.


更新:如 Raymond mentioned在评论中,在这种情况下,您可以使用 std::in_place_type_t 之一或std::in_place_index_t std::variant 的构造函数告诉编译器您要从 int 创建哪种内部类型.

关于c++ - 如何初始化这个具有两个类似替代方案的 std::variant 数据成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77318898/

相关文章:

swift - 无法将类型 'CFTimeInterval.Type' 的值转换为 'CFTimeInterval'?

c++ - 创建一个简单的脚本 'language' - 类似 VARIANT 的值类型

c++ - GCC9 是否允许避免 std::variant 的无值状态?

c++ - 将类类型存储为映射值并根据映射键初始化新类

c++ - 不可能向外界隐藏模板的实现(用于保护知识产权)。我对吗?

javascript - 在这种情况下初始化变量的正确方法?

scala - 我可以在 Scala 中定义 “method-private” 字段吗?

c++ - 写完扑克手评估器寻找新项目

C++11:无序实例成员初始化的不一致警告

delphi - 将<T>类型的值转换为Variant,可能吗?