2 回答

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
c-like,構(gòu)造函數(shù)和統(tǒng)一初始化之間有什么區(qū)別?
對于原始類型int,沒有實(shí)際的區(qū)別; 所以讓我們考慮一個(gè)類類型T。
第一種風(fēng)格相當(dāng)于
T x(T(0));
從初始化表達(dá)式創(chuàng)建臨時(shí)對象,然后x通過移動(dòng)或復(fù)制它來初始化。在實(shí)踐中,移動(dòng)或復(fù)制將被省略,因此結(jié)果與第二種風(fēng)格相同; 唯一的區(qū)別是,如果沒有可訪問的副本或移動(dòng)構(gòu)造函數(shù),第一個(gè)將失敗。
第二個(gè)使用帶有一個(gè)參數(shù)的構(gòu)造函數(shù)直接初始化對象,如果沒有合適的構(gòu)造函數(shù)則給出錯(cuò)誤。
第三個(gè)取決于可用的構(gòu)造函數(shù)。
如果有一個(gè)構(gòu)造函數(shù)std::initializer_list,它會(huì)使用它;
否則,如果有一個(gè)構(gòu)造函數(shù)采用合適類型的單個(gè)參數(shù),它會(huì)使用它;
否則,如果它是具有一個(gè)成員的聚合(沒有構(gòu)造函數(shù)),則該成員初始化為零;
否則,這是一個(gè)錯(cuò)誤。
我應(yīng)該總是使用統(tǒng)一初始化嗎?
沒有。有時(shí)您需要函數(shù)式初始化來區(qū)分initializer_list構(gòu)造函數(shù)和采用其他參數(shù)類型的構(gòu)造函數(shù)。例如:
std::vector<int> v1(10, 42); // 10 elements with value 42
std::vector<int> v2{10, 42}; // 2 elements with values 10 and 42
你也不應(yīng)該稱它為“統(tǒng)一初始化”,因?yàn)樗谌魏斡幸饬x的意義上都不是“統(tǒng)一的”。官方術(shù)語是“支撐初始化”。
- 2 回答
- 0 關(guān)注
- 722 瀏覽
添加回答
舉報(bào)