首页  >  文章  >  后端开发  >  为什么 gcc 和 clang 即使有默认构造函数也需要默认成员初始值设定项?

为什么 gcc 和 clang 即使有默认构造函数也需要默认成员初始值设定项?

Barbara Streisand
Barbara Streisand原创
2024-10-28 06:46:02236浏览

Why Does gcc and clang Require a Default Member Initializer Even with a Default Constructor?

理解编译器错误:“类结束前需要默认成员初始值设定项”

尝试使用 gcc8.2 和编译以下代码时clang7.0 中,用户可能会遇到以下错误消息:

default member initializer for 'Downloader::Hints::numOfMaxEasyHandles' required before the end of its enclosing class

此错误是由于 Downloader 类的 Hints 结构中的 numOfMaxEasyHandles 变量的默认成员初始值设定项存在微妙问题而发生的。

<code class="cpp">class Downloader
{
public:
    struct Hints
    {       
        int32_t numOfMaxEasyHandles = 8;
        //Hints(){}          // <= if I uncomment this all works gcc+clang+msvc
        //Hints() = default; // <= if I uncomment this neither clang no gcc works (msvc - works)
    };
};</code>

错误的根本原因:

如果 Hints 结构的默认构造函数 Hints() 未注释,错误消息就会消失。但是,如果将默认构造函数替换为 Hints() = default;,则该错误在 gcc 和 clang 中仍然存在。

此行为是 gcc 和 clang 中的已知错误。在这种情况下,编译器要求在结构定义本身内定义 numOfMaxEasyHandles 的默认成员初始值设定项,即使存在默认构造函数也是如此。

MSVC 的行为:

相比之下,MSVC2017 不会出现此错误,并且允许代码编译而不会出现任何问题。这是因为 MSVC 处理默认成员初始值设定项的方式与 gcc 和 clang 不同。

解决方法:

要解决 gcc 和 clang 中的错误,只需定义默认成员即可结构定义中的初始化程序:

<code class="cpp">struct Hints
{       
    int32_t numOfMaxEasyHandles = 8;
};</code>

通过此修改,代码应该在所有三个编译器中成功编译。

以上是为什么 gcc 和 clang 即使有默认构造函数也需要默认成员初始值设定项?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn