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

问题描述 投票:0回答:1

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

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
};
c++ initialization variant std-variant
1个回答
4
投票

xxx
会员是
int

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

当您使用

std::variant<Inner1, Inner3>
代替时,不会有任何歧义,因为
Inner3
无法由
int
构造。


更新:正如 Raymond 在评论中提到的那样,在这种情况下,您可以使用 std::in_place_type_t

std::in_place_index_t
 构造函数之一来告诉编译器您要从 
std::variant 创建哪种内部类型
.

© www.soinside.com 2019 - 2024. All rights reserved.