亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問具有非靜態成員初始化程序的類的C ++ 11聚合初始化

請問具有非靜態成員初始化程序的類的C ++ 11聚合初始化

C++
心有法竹 2019-11-04 11:24:49
標準中是否允許:struct A{  int a = 3;  int b = 3;};A a{0,1}; // ???此類仍在匯總嗎? clang接受此代碼,但gcc不接受。
查看完整描述

1 回答

?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

在具有類內成員初始化程序的C ++ 11中,結構/類不是聚合的-但是在C ++ 14中已更改。當我第一次遇到它時,我感到很驚訝,這種限制的理由是,類內初始化器與用戶定義的構造函數非常相似,但是計數器參數是沒有人真正期望添加類內初始化器可以使他們的班級/結構非聚集,我肯定沒有。


在C ++ 11標準草案的“ 8.5.1 聚合”部分(重點是我的工作):


集合是一個數組或一個類(第9章),沒有用戶提供的構造函數(12.1),沒有針對非靜態數據成員的括號或相等的初始化程序(9.2),沒有私有或受保護的非靜態數據成員(條款11),沒有基類(條款10)和虛擬函數(10.3)。


在C ++ 14中,同一段內容為:


聚合是沒有用戶提供的構造函數(12.1),沒有私有或受保護的非靜態數據成員(第11章),沒有基類(第10章)以及沒有虛函數(10.3)的數組或類(第9章) )。


這種變化是覆蓋在N3605:成員初始化和骨料它具有以下摘要:


Bjarne Stroustrup和Richard Smith提出了一個關于聚合初始化和成員初始化器無法協同工作的問題。本文建議采用Smith提出的措辭來解決此問題,該措辭消除了聚合不能具有成員初始化程序的限制。


該評論基本上總結了不愿允許它們聚合的想法:


聚合不能具有用戶定義的構造函數,而 成員初始化器本質上是某種用戶定義的構造函數(元素)(另請參見Core Defect 886)。我不反對這種擴展,但是它對我們的聚合模型實際上是有影響的。接受此擴展后,我想知道如何教授什么是聚合。


修訂版N3653于2013年5月通過。


更新資料


emsr指出,G ++ 5.0現在支持使用std=c++1y或使用非靜態數據成員初始化程序的C ++ 14聚合-std=c++14:


struct A { int i, j = i; };

A a = { 42 }; // a.j is also 42

看到它實時運行。



查看完整回答
反對 回復 2019-11-04
  • 1 回答
  • 0 關注
  • 376 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號