默认的默认构造函数触发器-Werror=effc 教我自己C++,并从我在本地巴尼斯和诺贝尔那里读到的一本书中学习一个例子。“Marc Greggoire专业C++”。我没有意识到这本书是为比我更有经验的人写的,但我一直在网上教程的帮助下蒙混过关,当然也是这样

默认的默认构造函数触发器-Werror=effc 教我自己C++,并从我在本地巴尼斯和诺贝尔那里读到的一本书中学习一个例子。“Marc Greggoire专业C++”。我没有意识到这本书是为比我更有经验的人写的,但我一直在网上教程的帮助下蒙混过关,当然也是这样,c++,C++,示例是一个包含两个构造函数的Employee类。一个显式默认,另一个使用引用初始化私有成员 使用IDE代码块执行此代码: #include <iostream> #include <string> using namespace std; class Employee { public: Employee() = default; //default constructor Employee(cons

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

使用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;
}
只发现编译器现在生成了一个关于显式默认构造函数的错误,“错误:显式默认'Employee::Employee()'的定义,前面的警告仍然存在。另一个SO搜索给了我以下信息:

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

Employee() = default;


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

正如链接的帖子所说,这个警告是c语言中的一个错误奥皮勒

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

您试图以另一种方式解决警告问题时,需要创建自己的默认构造函数,即使您已将其声明为
default
ed。这就像进入并驾驶自动汽车,然后在途中打开发动机罩并尝试自己换档

删除
default
之后,它就变成了一个普通的、用户声明的默认构造函数,一切又恢复正常了……如果比需要的更详细的话


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

您可以忽略此警告。具有类的std::string类型的数据成员将被默认初始化。我认为此警告实现得很糟糕。
=default
初始化构造函数的关键在于依赖所有成员(和基类)的默认构造函数。当成员初始值设定项列表中未提及某些成员(“您忘记初始化它们了吗?”)但编译器在您已明确声明意图(“默认所有内容”)的情况下发出警告,则该警告没有任何意义。这正是我所想的,Max,但我不明白,人们对这方面的了解远比我能做这么愚蠢的事情要多。我非常感谢所有的回答!谢谢!我没有在我的编译器中看到关于它是一个bug的部分。在我的辩护中,这是关于我访问过的第1000页,试图找出它,但非常感谢feedback仍然是,因为我开始有点疯狂了。我想知道编译器是否会有更新来修复这个问题。
Employee() = default;
Employee();