C++17 將會(huì)出現(xiàn)什么樣的變革?
這是我對(duì)當(dāng)前在厄巴納舉行的C++委員會(huì)會(huì)議上的提案方面文章的第三部分。 這次是全部關(guān)于子組變革的,對(duì)這方面,我寫(xiě)了很多文章,所以這僅僅是***部分。 前面那些部分是關(guān)于并發(fā)(concurrency)的, 然后 第二部分是關(guān)于核心,網(wǎng)絡(luò),模型以及未定義行為方面的。
變革
這個(gè)提議已經(jīng)在上一部分的反射部分提到了,在那里我們用反射和std::tie解決這個(gè)問(wèn)題。這份提議想讓 = default變得合法; 對(duì)于所有的操作符 (>,<,==,!=, ...)。這些操作符仍然使用友元方法來(lái)實(shí)現(xiàn),如下例所示:
- class Thing
- {
- int a, b;
- public:
- // ...
- friend bool operator<(const Thing&, const Thing&) = default;
- friend bool operator>(const Thing&, const Thing&) = default;
- friend bool operator<=(const Thing&, const Thing&) = default;
- friend bool operator>=(const Thing&, const Thing&) = default;
- };
因?yàn)橐呀?jīng)提議過(guò)有范圍的for(ranged-for)循環(huán),這個(gè)提議轉(zhuǎn)移到auto和默認(rèn)類(lèi)型.如果沒(méi)有提供類(lèi)型,它也希望,在其它語(yǔ)句中,引進(jìn)或采用有范圍的for的語(yǔ)法,使之合法,例如if語(yǔ)句:
- std::weak_ptr<foo> wp;
- if(x: wp.lock())
對(duì)于C++來(lái)說(shuō),這是一個(gè)巨大的改變,并且不是每個(gè)人都喜歡它,特別地,編譯器的創(chuàng)建者不得不處理這所波及的范圍.然而,如果委員會(huì)認(rèn)可了下個(gè)版本的有范圍的for循環(huán),那么在其他C++控制結(jié)構(gòu),如if,while,for等,中允許同樣的語(yǔ)法也就說(shuō)得通了.
這篇文章對(duì)應(yīng)的是N4074,它爭(zhēng)論提議的變化內(nèi)容,即讓{expr}顯式的返回是錯(cuò)誤的,因?yàn)轱@式的決不應(yīng)該是隱式的.關(guān)于草案中的更多細(xì)節(jié),作者甚至給出了一個(gè)例子,說(shuō)N4074提案可能導(dǎo)致未定義的行為.
N4135 -運(yùn)行時(shí)按規(guī)定校驗(yàn)的語(yǔ)言支持 (修訂8)
作者提供了很好的概述:
如果足夠仔細(xì),我們可以創(chuàng)建本質(zhì)上無(wú)缺陷的庫(kù).但是即便是***的庫(kù),只要使用不當(dāng),都可能產(chǎn)生災(zāi)難性的的后果.運(yùn)行時(shí)按規(guī)定校驗(yàn)的實(shí)際應(yīng)用:當(dāng)函數(shù)調(diào)用時(shí),檢測(cè)前綴條件的過(guò)程,有助于在早期測(cè)試中,發(fā)現(xiàn)誤用的情況.同時(shí)也有助于提升開(kāi)發(fā)速度,增強(qiáng)軟件健壯性.將按規(guī)定校驗(yàn)拓展為開(kāi)發(fā)階段而不僅僅是早期測(cè)試階段,將帶來(lái)更多長(zhǎng)遠(yuǎn)的益處. |
N4147 - 內(nèi)聯(lián)變量,或封裝表達(dá)式
作者再一次提供了很好的概述:
內(nèi)聯(lián)函數(shù)為對(duì)外無(wú)法暴露對(duì)象的接口,提供了合適的行為.盡管是不自然的樣版,通常還是會(huì)鼓勵(lì)用戶使用它們來(lái)包裝全局變量.其它的變通方法包括類(lèi)的靜態(tài)數(shù)據(jù)成員,枚舉,宏和變量模板,所有這些都有奇怪的語(yǔ)法或缺陷,限制了適用性.這個(gè)提議在變量定義上面指定了inline標(biāo)識(shí)符,這意味著在語(yǔ)義上類(lèi)似于內(nèi)聯(lián)函數(shù)的評(píng)估和鏈接.更通用的,這為命名值或非持續(xù)性變量提供了一種工具,它可以替代或補(bǔ)充 各種各樣的變通方法. |
N4148 - 不允許來(lái)自易拷貝類(lèi)型的不可訪問(wèn)操作符
當(dāng)前對(duì)于易拷貝類(lèi)型(trivially copyable type)的定義有一個(gè)缺陷:它對(duì)于不可訪問(wèn)的/刪除的 拷貝/移動(dòng) 構(gòu)造函數(shù)和賦值操作符同樣有效.一個(gè)易拷貝對(duì)象也可以通過(guò)使用std::memcpy來(lái)拷貝,特別是當(dāng)有一個(gè)易拷貝對(duì)象數(shù)組的時(shí)候,這在性能上更優(yōu).然而,對(duì)于一個(gè)刪除的/不可訪問(wèn)的 拷貝/移動(dòng) 構(gòu)造函數(shù)或者賦值操作符,這樣做是不明智的.作者提議更新標(biāo)準(zhǔn)里面的措辭,并提高特性,讓std::is_trivially_copyable針對(duì)不可訪問(wèn)的/刪除的 拷貝/移動(dòng) 構(gòu)造函數(shù)和操作符返回錯(cuò)誤.
同樣的,這篇文章也有很好的概述:
一些類(lèi)只在某些上下文中工作: 作用域守護(hù)(scope guard)作為子表達(dá)式通常是沒(méi)有用處的,表達(dá)式模板占位符作為局部變量也會(huì)出現(xiàn)問(wèn)題.一個(gè)沒(méi)有使用的函數(shù)的結(jié)果可能意味著調(diào)用者會(huì)使用不同的協(xié)議,如std::async.這個(gè)提議拓展了類(lèi)的聲明來(lái)阻止這類(lèi)錯(cuò)誤,并增加了通過(guò)類(lèi)型替換自動(dòng)解決它們的技術(shù),例如一個(gè)表達(dá)式模板的值類(lèi)型.另外,不可移動(dòng)的對(duì)象的生成變得更加容易處理.
增加的功能包括"自動(dòng)評(píng)估"提議里面提到的.這個(gè)提議更具表現(xiàn)力,可以更廣泛的應(yīng)用,并且易于接受和使用. |
N4150 - 別名集合屬性: 針對(duì)C++中restrict一樣的別名語(yǔ)義
這個(gè)提議想增加restrict修飾符到C++,因?yàn)樗呀?jīng)存在于C99之中,同時(shí),一些編譯器已經(jīng)提供了restrict作為一個(gè)C++拓展。由于目前沒(méi)有定義restrict修飾符,作者尋求定義如何正確的使用它,特別是在C++ 11中像lambda一樣的特性。
這篇文章想提高std::uncaught_exception的可用性:
函數(shù) int std::uncaught_exceptions() 返回了異常對(duì)象的數(shù)目,這些對(duì)象已經(jīng)初始化,并被拋出或者被重新拋出,但是沒(méi)有激活任何處理程序. |
這個(gè)提議想讓assert(斷言)成為語(yǔ)言結(jié)構(gòu),而不是一個(gè)宏定義:
assert宏定義從未表現(xiàn)得像一個(gè)真正的函數(shù),在可以預(yù)見(jiàn)的未來(lái),它將更像是一個(gè)操作符.在C中宏定義的表現(xiàn)方式,阻止了生產(chǎn)模式下的優(yōu)化,但是在調(diào)試模式下卻允許產(chǎn)生任意的副作用.增加assert作為一個(gè)關(guān)鍵字和內(nèi)置的操作符將產(chǎn)生益處,而不會(huì)存在任何副作用. |
這篇文章分析了如何在C++中支持契約式編程(contract programming)風(fēng)格的特性.它嘗試著提供一個(gè)概況,關(guān)于如何在編譯時(shí)而不是運(yùn)行時(shí)檢查的時(shí)候支持契約.作者定義了文檔的范圍,如下:
鑒于[N1962] 是一篇關(guān)于在C++之中增加契約式編程支持的相當(dāng)完整的提議,這個(gè)文檔提供的是問(wèn)題范圍,而不是一個(gè)特定的提議.我們集中于確認(rèn)期望值,潛在的實(shí)現(xiàn)困難以及代價(jià).
我們知道的其它契約式編程提議 — [N4075], [N4110] — 建立在一個(gè)假設(shè)之上.即前置條件的支持,必須以提供某種形式之下:在函數(shù)調(diào)用之前評(píng)估前置條件,偶爾取消前置條件的評(píng)估以及安裝未履行契約的處理程序.在這篇文章中,我們不會(huì)想當(dāng)然的做這種假設(shè).運(yùn)行時(shí)支持只是我們分析范圍的一個(gè)子集.我們更細(xì)致的探索了一個(gè)可選方案:集中于靜態(tài)分析.
作為正式的通用引用, 類(lèi)型T&& 總是右值(r-value)引用,除了作為模板參數(shù)或者使用了auto關(guān)鍵字。技術(shù)上仍然是右值引用,但是在這種情況下,表現(xiàn)上是非常不同。到目前為止,標(biāo)準(zhǔn)不識(shí)別這點(diǎn),作者想介紹這個(gè)術(shù)語(yǔ)前向引用(forwarding reference),關(guān)于在模板和auto關(guān)鍵字之中的右值引用。
N4165 - 統(tǒng)一調(diào)用語(yǔ)法
成員函數(shù)的調(diào)用語(yǔ)法是x.f() 或者 x->f(),而非成員函數(shù)則是f(x).這在泛型編程代碼中會(huì)是一個(gè)問(wèn)題,因?yàn)闆](méi)有統(tǒng)一的調(diào)用語(yǔ)法,而泛型編程代碼必須決定是調(diào)用成員函數(shù)還是非成員函數(shù)。
為了解決這個(gè)問(wèn)題,作者提議允許使用語(yǔ)法x./->f()來(lái)調(diào)用自由函數(shù),如果函數(shù)的***個(gè)參數(shù)是x的指針或者引用。這也很好的滿足C的用法,當(dāng)函數(shù)***個(gè)指針參數(shù)是一個(gè)結(jié)構(gòu)體的時(shí)候。作者使用FILE*和fseek作為例子。
當(dāng)前,std::initializer_list不是可移動(dòng)的,它是在移動(dòng)語(yǔ)義變得重要之前設(shè)計(jì)的.同時(shí),那個(gè)時(shí)候只提供拷貝語(yǔ)義看起來(lái)是足夠的,但是今天的情況已經(jīng)發(fā)生了變化.作者提議一個(gè)模板化版本的std::intializer_list,它繼承于非右值intializer_list類(lèi)型:
- template< typename T >
- struct initializer_list< T && >
- : initializer_list< T > {
這個(gè)構(gòu)造實(shí)現(xiàn)了所有權(quán)和移動(dòng)語(yǔ)義.
N4172 - 命名參數(shù)
命名參數(shù)的語(yǔ)法看起來(lái)和提議中的 "有范圍的for(ranged-for)循環(huán)" 類(lèi)似。但是在近似(幾乎一樣)的語(yǔ)法表達(dá)下面,兩者有不同的意義。在一個(gè)函數(shù)調(diào)用過(guò)程中,你可以像下面例子中這樣對(duì)命名參數(shù)賦值:
- void foo(int x, int y, int z);
- foo(40,z: 30, y:20);
在這個(gè)例子里面的函數(shù)調(diào)用過(guò)程中,參數(shù)z的值是30, 參數(shù)x的值是40。另外,非命名參數(shù)不能放在命名參數(shù)之后。
同樣的,這篇文章也有很好的概述:
這個(gè)提議允許用戶定義點(diǎn)操作符(操作符.()),這樣我們可以提供"智能引用"類(lèi)似于"智能指針".這個(gè)提議的要點(diǎn)在于,如果類(lèi)Ref定義了操作符.(),那么默認(rèn)在Ref對(duì)象上的每個(gè)操作都在操作符.()的結(jié)果之前.不管怎樣,顯式聲明為Ref成員函數(shù)的操作,應(yīng)用到Ref對(duì)象上時(shí)不需要前置.程序員可以通過(guò)聲明操作符.()為private,來(lái)阻止指向一個(gè)引用對(duì)象的指針"滲透"到更大的程序之中. |
N4174 - 調(diào)用語(yǔ)法: x.f(y) vs. f(x,y)
這個(gè)很像N4165 - 統(tǒng)一調(diào)用語(yǔ)法.簡(jiǎn)單的描述:
基本的建議是定義x.f(y)和f(x,y)是等價(jià)的.另外,為了增加兼容性和模塊性,我建議探索,當(dāng)查詢(xún)可調(diào)用成員函數(shù)(或函數(shù)對(duì)象)時(shí),忽略不可調(diào)用和不可訪問(wèn)的成員函數(shù)的可能性,. |
這份文檔廣泛的討論了在C++中預(yù)設(shè)的比較該是什么樣子,以及它能夠?qū)⒈容^運(yùn)算符設(shè)置為默認(rèn)值有什么意義。本文和N4126有很大關(guān)聯(lián),同時(shí)也與N4239相對(duì)應(yīng)。
N4176 - 對(duì)比較的思考
Bjarne總結(jié)了下關(guān)于預(yù)設(shè)比較的討論:
這是一份摘錄了系統(tǒng)預(yù)設(shè)比較草稿的部分討論的摘要。它提出了許多提議并且根據(jù)一系列標(biāo)準(zhǔn)做了比較。我將會(huì)對(duì)關(guān)于比較標(biāo)準(zhǔn)的選擇有關(guān)的評(píng)論尤其感興趣(故意的雙關(guān)語(yǔ))。 |
原文鏈接:http://www.oschina.net/translate/where-will-evolution-lead-cpp17