gpt4 book ai didi

c++ - 默认的默认构造函数触发器 -Werror=effc

转载 作者:行者123 更新时间:2023-11-28 04:09:06 27 4
gpt4 key购买 nike

自学 C++ 并处理我在本地 Barnes and Noble 挑选的一本书中的示例。 “Marc Greggoire 的专业 C++”。我没有意识到这本书是为那些比我经验多一点的人准备的,但我一直在在线教程的帮助下蒙混过关,当然还有 SO。

该示例是一个具有两个构造函数的 Employee 类。一个显式默认,另一个使用引用初始化私有(private)成员。

使用 Code Blocks IDE 此代码:

#include <iostream>
#include <string>
using namespace std;

class Employee
{
public:

Employee() = default; //default constructor
Employee(const std::string& firstName,
const std:: string& lastName);

private:
std::string mFirstName;
std::string mLastName;
};

Employee::Employee(const string& firstName, const string& lastName) : mFirstName(firstName), mLastName(lastName)
{
}

int main()
{
cout << "Testing the Employee class." << endl;

Employee emp;

return 0;
}

在显式默认构造函数上生成编译器警告,变量应在成员初始化列表 [-Werror=effc] 中初始化。

SO 的快速搜索表明,也许可以忽略它。

Can I ignore the gcc warning: ‘Foo::m_bar’ should be initialized in the member initialization list [-Weffc++]

因为我不太明白为什么可以忽略它,所以我尝试通过在默认构造函数的定义中提供成员初始化来消除警告:

Employee::Employee() : mFirstName("Empty"), mLastName("Empty")
{
}

只是发现编译器现在已经生成了一个关于显式默认构造函数的错误,“错误:显式默认'Employee::Employee()'的定义和之前的警告仍然存在。另一个SO搜索给了我这个:

How is "=default" different from "{}" for default constructor and destructor?

这似乎表明使用 Employee() = default; 会更清楚,但使用 Employee(); 仍然有效。所以我保留了默认构造函数初始化并将默认构造函数声明更改为:

Employee() = default;

Employee();

现在编译器对带有成员初始化列表的新默认构造函数声明很满意,但我真的很想了解这里发生了什么。我完全理解为什么(从 SO 讨论中)如果存在显式默认构造函数但用户提供了初始化列表,编译器会出错。这是有道理的。对我来说没有意义的是为什么编译器在明确要求一个时,提供一个明确默认的构造是矛盾的。

最佳答案

正如链接帖子所说,该警告是编译器中的一个错误

代码很好,初始化也很好。 defaulted 默认构造函数 (!) 也将默认构造字符串成员。

您尝试以另一种方式解决警告涉及创建您自己的默认构造函数,即使您已将其声明为 defaulted。这就像进入并驾驶一辆自动档汽车,然后在途中打开引擎盖并尝试自己换挡。

删除 default 然后使它成为一个普通的、用户声明的默认构造函数并且一切都再次正常......如果比它需要的更冗长。

(再次使用“默认”一词是委员会的一个非常不幸的选择!)

关于c++ - 默认的默认构造函数触发器 -Werror=effc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58203592/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com