以下代码无法编译。为什么会有这个限制,我该如何绕过它?如果我替换变体声明,它就会编译。
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
.
Inner1
和Inner2
两者都可以从(引用)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/