3 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
當(dāng)詢問構(gòu)造函數(shù)時(shí),這是一個(gè)與析構(gòu)函數(shù)完全不同的問題。
如霍華德指出virtual,如果您的析構(gòu)函數(shù)是,則差異可以忽略不計(jì)。但是,如果您的析構(gòu)函數(shù)不是虛擬的,那就完全不一樣了。構(gòu)造函數(shù)也是如此。
= default對特殊的成員函數(shù)(默認(rèn)構(gòu)造函數(shù),復(fù)制/移動(dòng)構(gòu)造函數(shù)/賦值,析構(gòu)函數(shù)等)使用語法意味著與簡單地做有很大的不同{}。使用后者,該功能將變?yōu)椤坝脩籼峁?。這改變了一切。
根據(jù)C ++ 11的定義,這是一個(gè)瑣碎的類:
struct Trivial
{
int foo;
};
如果嘗試默認(rèn)構(gòu)造一個(gè),則編譯器將自動(dòng)生成一個(gè)默認(rèn)構(gòu)造函數(shù)。復(fù)制/移動(dòng)和銷毀也是如此。因?yàn)橛脩魶]有提供任何這些成員函數(shù),所以C ++ 11規(guī)范將其視為“瑣碎的”類。因此,這樣做是合法的,例如將其內(nèi)容memcpy初始化以此類推。
這個(gè):
struct NotTrivial
{
int foo;
NotTrivial() {}
};
顧名思義,這不再是瑣碎的事。它具有用戶提供的默認(rèn)構(gòu)造函數(shù)。它是否為空無關(guān)緊要;就C ++ 11的規(guī)則而言,這不能是瑣碎的類型。
這個(gè):
struct Trivial2
{
int foo;
Trivial2() = default;
};
顧名思義,這是一個(gè)瑣碎的類型。為什么?因?yàn)槟嬖V編譯器自動(dòng)生成默認(rèn)構(gòu)造函數(shù)。因此,構(gòu)造函數(shù)不是“用戶提供的”。因此,該類型被認(rèn)為是微不足道的,因?yàn)樗鼪]有用戶提供的默認(rèn)構(gòu)造函數(shù)。
= default當(dāng)添加阻止創(chuàng)建此類函數(shù)的成員函數(shù)時(shí),該語法主要用于執(zhí)行諸如復(fù)制構(gòu)造函數(shù)/賦值之類的操作。但是它還會(huì)觸發(fā)編譯器的特殊行為,因此它在默認(rèn)構(gòu)造函數(shù)/析構(gòu)函數(shù)中也很有用。

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
他們都是不平凡的。
它們都具有相同的noexcept規(guī)范,具體取決于基礎(chǔ)和成員的noexcept規(guī)范。
到目前為止,我檢測到的唯一區(qū)別是,如果Widget包含具有不可訪問或刪除的析構(gòu)函數(shù)的基或成員:
struct A
{
private:
~A();
};
class Widget {
A a_;
public:
#if 1
virtual ~Widget() = default;
#else
virtual ~Widget() {}
#endif
};
然后,=default解決方案將編譯,但Widget不會(huì)是可破壞的類型。即,如果您嘗試破壞Widget,則會(huì)收到編譯時(shí)錯(cuò)誤。但是,如果不這樣做,您就有一個(gè)有效的程序。
Otoh,如果您提供用戶提供的析構(gòu)函數(shù),則無論您是否解構(gòu)a,事情都不會(huì)編譯Widget:
test.cpp:8:7: error: field of type 'A' has private destructor
A a_;
^
test.cpp:4:5: note: declared private here
~A();
^
1 error generated.
- 3 回答
- 0 關(guān)注
- 5320 瀏覽
添加回答
舉報(bào)