C++17 將有什麼變革?
這是我對當前在厄巴納舉行的C++委員會會議上的提案方面文章的第三部分。 這次是全部關於子組變革的,對這方面,我寫了很多文章,所以這僅僅是第一部分。 前面那些部分是關於併發(concurrency)的, 然後 第二部分是關於核心,網路,模型以及未定義行為方面的。
變革
N4126 - 顯式預設比較操作符
這個提議已經在上一部分的反射部分提到了,在那裡我們用反射和std::tie解決這個問題。這份提議想讓 = default變得合法; 對於所有的操作符 (>,<,==,!=, ...)。這些操作符仍然使用友元方法來實現,如下例所示:
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; };
N4127 - 檢查後的解引用條件
因為已經提議過有範圍的for(ranged-for)迴圈,這個提議轉移到auto和預設型別.如果沒有提供型別,它也希望,在其它語句中,引進或採用有範圍的for的語法,使之合法,例如if語句:
std::weak_ptr<foo> wp; if(x: wp.lock())
對於C++來說,這是一個巨大的改變,並且不是每個人都喜歡它,特別地,編譯器的建立者不得不處理這所波及的範圍.然而,如果委員會認可了下個版本的有範圍的for迴圈,那麼在其他C++控制結構,如if,while,for等,中允許同樣的語法也就說得通了.
N4131 - 顯式的絕不應該是隱式的
這篇文章對應的是N4074,它爭論提議的變化內容,即讓{expr}顯式的返回是錯誤的,因為顯式的決不應該是隱式的.關於草案中的更多細節,作者甚至給出了一個例子,說N4074提案可能導致未定義的行為.
N4135 -執行時按規定校驗的語言支援 (修訂8)
作者提供了很好的概述:
如果足夠仔細,我們可以建立本質上無缺陷的庫.但是即便是最好的庫,只要使用不當,都可能產生災難性的的後果.執行時按規定校驗的實際應用:當函式呼叫時,檢測字首條件的過程,有助於在早期測試中,發現誤用的情況.同時也有助於提升開發速度,增強軟體健壯性.將按規定校驗擴充為開發階段而不僅僅是早期測試階段,將帶來更多長遠的益處.
N4147 - 內聯變數,或封裝表示式
作者再一次提供了很好的概述:
行內函數為對外無法暴露物件的介面,提供了合適的行為.儘管是不自然的樣版,通常還是會鼓勵使用者使用它們來包裝全域性變數.其它的變通方法包括類的靜態資料成員,列舉,巨集和變數模板,所有這些都有奇怪的語法或缺陷,限制了適用性.這個提議在變數定義上面指定了inline識別符號,這意味著在語義上類似於行內函數的評估和連結.更通用的,這為命名值或非持續性變數提供了一種工具,它可以替代或補充 各種各樣的變通方法.
N4148 - 不允許來自易拷貝型別的不可訪問操作符
當前對於易拷貝型別(trivially copyable type)的定義有一個缺陷:它對於不可訪問的/刪除的 拷貝/移動 建構函式和賦值操作符同樣有效.一個易拷貝物件也可以通過使用std::memcpy來拷貝,特別是當有一個易拷貝物件陣列的時候,這在效能上更優.然而,對於一個刪除的/不可訪問的 拷貝/移動 建構函式或者賦值操作符,這樣做是不明智的.作者提議更新標準裡面的措辭,並提高特性,讓std::is_trivially_copyable針對不可訪問的/刪除的 拷貝/移動 建構函式和操作符返回錯誤.
N4149 - 明確且合適的類
同樣的,這篇文章也有很好的概述:
一些類只在某些上下文中工作: 作用域守護(scope guard)作為子表示式通常是沒有用處的,表示式模板佔位符作為區域性變數也會出現問題.一個沒有使用的函式的結果可能意味著呼叫者會使用不同的協議,如std::async.這個提議擴充了類的宣告來阻止這類錯誤,並增加了通過型別替換自動解決它們的技術,例如一個表示式模板的值型別.另外,不可移動的物件的生成變得更加容易處理.
增加的功能包括"自動評估"提議裡面提到的.這個提議更具表現力,可以更廣泛的應用,並且易於接受和使用.
N4150 - 別名集合屬性: 針對C++中restrict一樣的別名語義
這個提議想增加restrict修飾符到C++,因為它已經存在於C99之中,同時,一些編譯器已經提供了restrict作為一個C++擴充。由於目前沒有定義restrict修飾符,作者尋求定義如何正確的使用它,特別是在C++ 11中像lambda一樣的特性。
N4152 - 未捕獲的異常
這篇文章想提高std::uncaught_exception的可用性:
函式 int std::uncaught_exceptions() 返回了異常物件的數目,這些物件已經初始化,並被丟擲或者被重新丟擲,但是沒有啟用任何處理程式.
N4154 - 操作符斷言
這個提議想讓assert(斷言)成為語言結構,而不是一個巨集定義:
assert巨集定義從未表現得像一個真正的函式,在可以預見的未來,它將更像是一個操作符.在C中巨集定義的表現方式,阻止了生產模式下的優化,但是在除錯模式下卻允許產生任意的副作用.增加assert作為一個關鍵字和內建的操作符將產生益處,而不會存在任何副作用.
N4160 - 值約束
這篇文章分析瞭如何在C++中支援契約式程式設計(contract programming)風格的特性.它嘗試著提供一個概況,關於如何在編譯時而不是執行時檢查的時候支援契約.作者定義了文件的範圍,如下:
鑑於[N1962] 是一篇關於在C++之中增加契約式程式設計支援的相當完整的提議,這個文件提供的是問題範圍,而不是一個特定的提議.我們集中於確認期望值,潛在的實現困難以及代價.
我們知道的其它契約式程式設計提議 — [N4075], [N4110] — 建立在一個假設之上.即前置條件的支援,必須以提供某種形式之下:在函式呼叫之前評估前置條件,偶爾取消前置條件的評估以及安裝未履行契約的處理程式.在這篇文章中,我們不會想當然的做這種假設.執行時支援只是我們分析範圍的一個子集.我們更細緻的探索了一個可選方案:集中於靜態分析.
N4164 - 前向引用
作為正式的通用引用, 型別T&& 總是右值(r-value)引用,除了作為模板引數或者使用了auto關鍵字。技術上仍然是右值引用,但是在這種情況下,表現上是非常不同。到目前為止,標準不識別這點,作者想介紹這個術語前向引用(forwarding reference),關於在模板和auto關鍵字之中的右值引用。
N4165 - 統一呼叫語法
成員函式的呼叫語法是x.f() 或者 x->f(),而非成員函式則是f(x).這在泛型程式設計程式碼中會是一個問題,因為沒有統一的呼叫語法,而泛型程式設計程式碼必須決定是呼叫成員函式還是非成員函式。
為了解決這個問題,作者提議允許使用語法x./->f()來呼叫自由函式,如果函式的第一個引數是x的指標或者引用。這也很好的滿足C的用法,當函式第一個指標引數是一個結構體的時候。作者使用FILE*和fseek作為例子。
N4166 - 可移動的初始化列表
當前,std::initializer_list不是可移動的,它是在移動語義變得重要之前設計的.同時,那個時候只提供拷貝語義看起來是足夠的,但是今天的情況已經發生了變化.作者提議一個模板化版本的std::intializer_list,它繼承於非右值intializer_list型別:
template< typename T > struct initializer_list< T && > : initializer_list< T > {
這個構造實現了所有權和移動語義.
N4172 - 命名引數
命名引數的語法看起來和提議中的 "有範圍的for(ranged-for)迴圈" 類似。但是在近似(幾乎一樣)的語法表達下面,兩者有不同的意義。在一個函式呼叫過程中,你可以像下面例子中這樣對命名引數賦值:
void foo(int x, int y, int z); foo(40,z: 30, y:20);
在這個例子裡面的函式呼叫過程中,引數z的值是30, 引數x的值是40。另外,非命名引數不能放在命名引數之後。
N4173 - 點操作符
同樣的,這篇文章也有很好的概述:
這個提議允許使用者定義點操作符(操作符.()),這樣我們可以提供"智慧引用"類似於"智慧指標".這個提議的要點在於,如果類Ref定義了操作符.(),那麼預設在Ref物件上的每個操作都在操作符.()的結果之前.不管怎樣,顯式宣告為Ref成員函式的操作,應用到Ref物件上時不需要前置.程式設計師可以通過宣告操作符.()為private,來阻止指向一個引用物件的指標"滲透"到更大的程式之中.
N4174 - 呼叫語法: x.f(y) vs. f(x,y)
這個很像N4165 - 統一呼叫語法.簡單的描述:
基本的建議是定義x.f(y)和f(x,y)是等價的.另外,為了增加相容性和模組性,我建議探索,當查詢可呼叫成員函式(或函式物件)時,忽略不可呼叫和不可訪問的成員函式的可能性,.
N4175 - 系統設定的比較
這份文件廣泛的討論了在C++中預設的比較該是什麼樣子,以及它能夠將比較運算子設定為預設值有什麼意義。本文和N4126有很大關聯,同時也與N4239相對應。
N4176 - 對比較的思考
Bjarne總結了下關於預設比較的討論:
這是一份摘錄了系統預設比較草稿的部分討論的摘要。它提出了許多提議並且根據一系列標準做了比較。我將會對關於比較標準的選擇有關的評論尤其感興趣(故意的雙關語)。
原文地址:http://meetingcpp.com/index.php/br/items/where-will-evolution-lead-cpp17.html
相關文章
- 為什麼軟體測試需要變革?
- Kaizen與變革管理中持續改進的理念是什麼?AI
- 為什麼說Python是Fintech與金融變革的祕密武器Python
- 為什麼說Python是Fintech與金融變革的秘密武器Python
- 什麼是環境變數?python設定環境變數有什麼用?變數Python
- 無伺服器Serverless將變革工作流BPM伺服器Server
- ARVR或將徹底變革廣告營銷行業VR行業
- 為什麼 Go 有兩種宣告變數的方式,有什麼區別,哪種好?Go變數
- Java 17 與 Java 11 相比有什麼變化?Java
- 大廈將傾,網際網路將如何變革傳統行業(上)行業
- 大廈將傾,網際網路將如何變革傳統行業(下)行業
- 同城電商模式趨於成熟 一場變革即將到來!模式
- 互動派:大資料必將驅動企業變革大資料
- 亞馬遜、微軟、谷歌和SoftLayer將掀託管市場變革狂潮亞馬遜微軟谷歌
- RPA與AI的融合,將會變成什麼樣?AI
- 健身環變得這麼貴,和中國有什麼關係?
- 什麼是Django?有什麼用途?Django
- Python語言中合法變數命名有什麼規則?Python變數
- [python]為什麼父類的值沒有改變Python
- “Go語言”有什麼用途?有什麼優勢?Go
- 你有沒有想過: 為什麼Java中String是不可變的?Java
- SAP變革-下月將釋出基於Web的企業軟體(轉)Web
- C++17 相比於 C++14 的所有重大變化C++
- NLA有什麼用?原理是什麼?
- 區塊鏈助力教育變革區塊鏈
- 專案的變革軌跡(轉)
- 完美世界:變革進行時
- 出道即巔峰!7月16日公測的《世界啟元》,憑什麼掀起SLG品類變革?
- 安全平行切面改變了網安產品技術架構,將引發行業變革架構行業
- 有什麼簡單的將caj轉換成Word的方法
- 假如騰訊阿里消失了,這個社會將變成什麼樣?阿里
- 為什麼說自動化特徵工程將改變機器學習的方式特徵工程機器學習
- 隱私計算真的是一項變革性技術麼?
- 周線波段操作有什麼技巧,什麼是周線波段操作有什麼技巧
- GPT-4狂飆釋出,AI時代運維將產生哪些變革GPTAI運維
- 使用雲端計算有什麼好處?有什麼幫助
- 3 * 0.1 == 0.3將會返回什麼?為什麼?
- 根證書是什麼?有什麼用?