在芬蘭奧盧的最后一場(chǎng)會(huì)議中,ISO C++委員會(huì)完成了C++17功能列表的定義。在會(huì)議中,通過(guò)了許多新的語(yǔ)言和庫(kù)的功能,包括constexpr if、template
正如委員會(huì)成員Jens Weller所寫(xiě)道,現(xiàn)在功能列表已經(jīng)完成,即將開(kāi)始復(fù)查階段:
接下來(lái)的兩次會(huì)議主要會(huì)推進(jìn)復(fù)查、反饋和國(guó)家級(jí)機(jī)構(gòu)標(biāo)記的問(wèn)題。這不會(huì)給標(biāo)準(zhǔn)增加新的內(nèi)容,但是可能有輕微或重大變化。
在奧盧的最后一次委員會(huì)議上,C++17新增的功能中,Weller強(qiáng)調(diào)了以下功能:
std::variant,它提供了一個(gè)安全、范式、基于棧的可區(qū)別union容器。
if constexpr(expression),它可以看作C++版本中編譯期的 if。
Template auto,它允許使用auto聲明非類(lèi)型的模版參數(shù)。這會(huì)允許開(kāi)發(fā)者們寫(xiě)這樣的代碼:
template void f() { }f<10>; // deduces intHerb Sutter強(qiáng)調(diào)了這個(gè)功能開(kāi)啟的許多可能性,例如在一個(gè)函數(shù)模版內(nèi)部而不是通過(guò)許多模板特化來(lái)囊括所有它的算法特例情況。
結(jié)構(gòu)化綁定,它使得在元組中聲明并初始化多個(gè)變量成為可能:
tuple get_tuple();auto [a , b , c] = get_tuple();if和which中的變量聲明與for循環(huán)中已經(jīng)允許的格式相似:
map mymap;if (auto result = mymap.insert(value); result.second) {// insert succeeded, and result is valid for this blockuse(result.first); // ok// ...}另外,Sutter提到了其他一些值得強(qiáng)調(diào)的新特性,包括:
為字節(jié)對(duì)齊數(shù)據(jù)動(dòng)態(tài)內(nèi)存分配保證副本省略,這可以確保當(dāng)你使用一個(gè)值傳遞的對(duì)象來(lái)初始化本地變量時(shí),編譯器不會(huì)執(zhí)行任何額外的復(fù)制或移動(dòng),就像C++11里一樣。上面的列表中只包括了上一次委員會(huì)議中通過(guò)的新特性,但是新C++17中的功能列表部分會(huì)更長(zhǎng)一些。如欲獲取審核過(guò)程結(jié)束后新標(biāo)準(zhǔn)中的內(nèi)容概覽,請(qǐng)?jiān)赟tack Overflow跟帖中查看。
查看英文原文:C++17 Feature List is Now Complete, Enters Review