簡體   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