繁体   English   中英

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

[英]Defaulted default constructor triggers -Werror=effc

自学 C++ 并从我在当地的 Barnes and Noble 买的一本书中学习一个例子。 “Marc Greggoire 的专业 C++”。 我没有意识到这本书是为那些比我有更多经验的人准备的,但我一直在借助在线教程,当然还有 SO 的帮助下勉强完成了这本书。

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

使用代码块 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 表明这可能可以忽略不计。

我可以忽略 gcc 警告:'Foo::m_bar' 应该在成员初始化列表中初始化 [-Weffc++]

由于我不太明白为什么可以忽略这一点,因此我无论如何都尝试通过在默认构造函数的定义中提供成员初始化来消除对 go 的警告:

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

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

对于默认构造函数和析构函数,“=default”与“{}”有何不同?

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

Employee() = default;

Employee();

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

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

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

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

删除default使其只是一个普通的、用户声明的默认构造函数,一切都很好……如果比它需要的更详细的话。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM