簡體   English   中英

C ++中的顯式默認構造函數17

[英]Explicit default constructors in C++17

在C ++ 17中,標准庫中的空標記類型現在具有標記為explicit默認構造explicit ,並且也是= default 例如, std::piecewise_construct_t現在定義為

struct piecewise_construct_t { explicit piecewise_construct_t() = default; };

我的問題很簡單,這是C ++ 14改變的原因是什么? 明確默認的顯式默認構造函數(!)對空類的意義是什么?

(為了避免被標記為欺騙:2010年的這個問題詢問了顯式默認構造函數的用途,但那是在C ++ 11之前和很久以前的事情,所以事情可能已經改變了。 這個問題是最新的,但是答案似乎表明,無論是否存在默認構造函數,都會執行聚合初始化,因此我對最新標准中此更改的原因感到好奇。)

庫更改的基本原理是LWG 2510“標簽類型不應該是DefaultConstructible

std::experimental::optional ,由於某些原因,指定其nullopt類型不是DefaultConstructible 對於其標記類型in_place_t ,它不in_place_t並且標准也不適用於任何標記類型。 結果證明非常不幸,請考慮以下事項:

 #include <memory> #include <array> void f(std::array<int, 1>, int) {} // #1 void f(std::allocator_arg_t, int) {} // #2 int main() { f({}, 666); // #3 } 

#3的電話不明確。 更糟糕的是,如果刪除重載#1,則調用工作正常。 標記類型的全部要點是它需要在調用中提及或者它需要是轉發參數,因此能夠構造類似的標記類型是沒有意義的。

LWG問題與CWG 1518“顯式默認構造函數和復制列表初始化”並行發展,具有有用的背景。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM