首页 > 后端开发 > C++ > 使用非平凡构造函数作为默认参数时,为什么会出现'类结束前需要默认成员初始值设定项”错误?

使用非平凡构造函数作为默认参数时,为什么会出现'类结束前需要默认成员初始值设定项”错误?

DDD
发布: 2024-10-29 08:04:02
原创
837 人浏览过

Why Does

理解编译器错误“Default Member Initializer required Before Class End”

在此代码片段中:

<code class="cpp">#include <cassert>
#include <iostream>
#include <cstdlib>

class Downloader
{
public:
    struct Hints
    {       
        int32_t numOfMaxEasyHandles = 8;
    };

    static Downloader *Create(const Hints &hints = Hints());
};

Downloader* Downloader::Create(const Hints &hints)
{
    std::cout << hints.numOfMaxEasyHandles << std::endl;
    return nullptr;
}</code>
登录后复制

当尝试定义构造 Hints 结构实例的默认参数时,Clang 和 GCC 编译器会引发错误消息“在其封闭类结束之前需要默认成员初始值设定项”。

原因错误

发生此错误是因为 Create 函数的默认参数是一个非平凡的构造函数,它需要在 Hints 结构的声明中定义默认成员初始值设定项。如果没有成员初始值设定项,则在使用默认参数时,编译器无法确定 numOfMaxEasyHandles 成员的初始值。

解决方案

要解决此问题,提示结构应包含默认成员初始值设定项,如下所示:

<code class="cpp">struct Hints
{       
    int32_t numOfMaxEasyHandles = 8;
    Hints() {}  // Default member initializer
};</code>
登录后复制

使用默认成员初始值设定项,Clang 和 GCC 将能够成功编译代码。请注意,Hints 结构需要定义一个显式默认构造函数才能使此解决方案正常工作。

GCC 和 Clang Bug

人们可能会注意到以下行:

<code class="cpp">Hints() = default;</code>
登录后复制

无法解决 Clang 和 GCC 的问题。这是这些编译器中的一个已知错误,在某些上下文中,例如当构造函数用作默认参数时,无法正确识别非平凡构造函数的默认成员初始值设定项。

以上是使用非平凡构造函数作为默认参数时,为什么会出现'类结束前需要默认成员初始值设定项”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板