如果初始化成员,嵌套结构中的变体C ++编译错误

问题描述

我正在尝试将std :: variant用于复杂结构,我尝试使用此代码

示例1

#include <variant>

struct A {
    int i = 1;
};

struct B {
    bool flag = false;
};

struct dataVariant {    

    using Member = std::variant<A,B>;
    Member data;
};


int main() {
    auto d = dataVariant{};
}

这可行。

然后我尝试以这种方式嵌套struct Astruct B

示例2:

#include <variant>
struct dataVariant {    
    struct A {
        int i = 1;
    };

    struct B {
        bool flag = false;
    };
    using Member = std::variant<A,B>;
    Member data;
};


int main() {
    auto d = dataVariant{};
}

编译器给我这个错误

<source>: In function 'int main()':

<source>:16:26: error: use of deleted function 'std::variant<_Types>::variant() [with _Types = {dataVariant::A,dataVariant::B}]'

   16 |     auto d = dataVariant{};

      |                          ^

In file included from <source>:1:

/opt/compiler-explorer/gcc-10.2.0/include/c++/10.2.0/variant:1347:7: note: 'std::variant<_Types>::variant() [with _Types = {dataVariant::A,dataVariant::B}]' is implicitly deleted because the default deFinition would be ill-formed:

 1347 |       variant() = default;

      |       ^~~~~~~

/opt/compiler-explorer/gcc-10.2.0/include/c++/10.2.0/variant:1347:7: error: use of deleted function 'constexpr std::_Enable_default_constructor<false,_Tag>::_Enable_default_constructor() [with _Tag = std::variant<dataVariant::A,dataVariant::B>]'

In file included from /opt/compiler-explorer/gcc-10.2.0/include/c++/10.2.0/variant:38,from <source>:1:

/opt/compiler-explorer/gcc-10.2.0/include/c++/10.2.0/bits/enable_special_members.h:110:15: note: declared here

  110 |     constexpr _Enable_default_constructor() noexcept = delete;

      |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~

尝试一下后,我发现如果不初始化该结构的成员,则会编译它:

示例3:

#include <variant>
struct dataVariant {    
    struct A {
        int i;
    };

    struct B {
        bool flag;
    };
    using Member = std::variant<A,B>;
    Member data;
};


int main() {
    auto d = dataVariant{};
}

现在我不明白编译错误,也许我想念一些东西,但是为什么它是全局结构而不是嵌套结构初始化而编译?

注意:我尝试使用GCC 10.2-std=c++20-std=c++17标志对其进行编译。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)