以下代码无法编译。为什么会有这个限制,我该如何绕过它?有趣的是,如果我替换变体声明 - 所有都会编译
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
};```
Inner1
和 Inner2
都可以从 int
构造,因此 x(xxx)
对于 std::variant<Inner1, Inner2>
是不明确的,因为编译器不知道您要在 variant
内构造哪种类型。
当您使用
std::variant<Inner1, Inner3>
代替时,不会有任何歧义,因为 Inner3
无法由 int
构造。