首页  >  文章  >  后端开发  >  为什么在使用类作为默认参数时,GCC 和 Clang 会抛出“需要默认成员初始值设定项”?

为什么在使用类作为默认参数时,GCC 和 Clang 会抛出“需要默认成员初始值设定项”?

Barbara Streisand
Barbara Streisand原创
2024-10-26 10:49:02497浏览

Why Does GCC and Clang Throw

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

尝试定义一个使用该类作为默认参数值的函数中类成员的默认成员初始值设定项。像 gcc 和 clang 这样的编译器在使用此构造时会遇到困难,而 msvc2017 可以成功处理它。

考虑以下代码片段:

<code class="cpp">class Downloader
{
public:
    struct Hints
    {       
        int32_t numOfMaxEasyHandles = 8;
    };

    static Downloader *Create(const Hints &amp;hints = Hints());
};</code>

提供的代码旨在为 numOfMaxEasyHandles 定义默认值Hints 结构的成员,用作 Create 函数中的默认参数。但是,gcc 和 clang 无法编译此代码,并发出错误:

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

错误原因

此错误是由于 gcc 和中的错误而发生的clang 涉及类中用作函数中默认参数的默认成员初始值设定项的处理。编译器希望默认成员初始值设定项在类定义本身中定义,而不是在函数体内定义。

可能的解决方法

要解决此问题,有两种潜在的解决方法:

  1. 取消注释 Hints(){}: 将空构造函数添加到 Hints 结构可以缓解编译器错误。但是,这种方法可能并不理想,因为它违背了默认成员初始值设定项的目的。
  2. 使用 Hints() = default: 此语句显式定义了 Hints 结构的默认构造函数。虽然它消除了 msvc2017 中的编译器错误,但由于上述 bug,它导致代码与 gcc 和 clang 不兼容。

以上是为什么在使用类作为默认参数时,GCC 和 Clang 会抛出“需要默认成员初始值设定项”?的详细内容。更多信息请关注PHP中文网其他相关文章!

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