2016-11-16 126 views
5

n3639提議通過 S的成C++ 14C++ 14中的可變長度數組?

latest I've been able to find列表n3639如(至少對於所述第一尺寸。):在C的第一CD

特點++ 14,隨後刪除到一個技術規範

這是否曾經使它成爲一個技術規範,或者它是否失去了手?

原因我的問題是,我發現這段代碼:(使用「-pedantic」標誌時)

void f(size_t n) { 
    int a[n]; 
    for (size_t i = 0; i < n; ++i) 
     a[i] = 2 * i; 
    sort(a, a + n); 
} 

這種失敗在Visual Studio 2015年在海灣合作委員會建立

Works fine下gcc5.1,但仍 fails to build的Visual Studio 2015下

這只是gcc的錯誤在C++ 14支持C99的變長數組或沒有這在某種程度上使之成爲C++ 14和Visual Studio 2015年失敗d來撿起來?

編輯:它看起來像GCC有去除gcc6.2支持: http://coliru.stacked-crooked.com/a/303ae1970fa3f5d2

+2

自C++ 03或更早版本以來,它一直是GCC擴展。 –

+1

GCC支持這個擴展。打開警告標誌。或者更好的是,不要在C++中使用VLA。 – DeiDei

+1

[已從標準中刪除](https://gcc.gnu.org/projects/cxx-status.html) –

回答

9

首先,n3639一直在尋找到位陣列,運行時綁定(ARB)沒有變長數組(VLA )。 ARBs的將支持VLAS的一個子集,其不包括:

  • 多維數組,其中除頂層已經運行時約束(類似於,陣列新不支持任一)
  • 修改函數聲明語法
  • sizeof(a)是一個運行時間計算的表達式返回的a
  • typedef int a[n];評估n以及使通過所述typedef
  • 0的大小

在伊薩誇,華盛頓2014年2月,在標準委員會unanimously votedn3820形成陣列擴展技術規範,這是最初的版本來源於n3639和the proposal of Dynarrays

2014年5月,n4043n4050分別試圖解決陣列擴展技術規範的Dynarray和ARB部分中的一些「半編輯問題」。

the standard committee's October 24 2014 teleconference引用了語言設施,實現可能性以及Array Extensions技術規範對數據擴展技術規範的渴望方面的巨大分歧,最終將其描述爲處於僵局狀態。

The standard committee's May 2015 meeting in Lenexa, Kansas繼續給該陣列擴展技術規格將不會接受它的當前形式,並建議方向性指引:

剝離其當前內容的TS,並等待一個可行的建議沿着[1]

最終the standard committee's March 2016 meeting in Jacksonville, Florida移動關閉陣列擴展技術規範在確認一些陣列相關的建議是目標來而不是圖書館基礎技術規範。有一個unanimous vote to do so與8強烈贊成,5贊成,6棄權。

順便說一下,進入庫基礎技術規範的唯一與陣列相關的工作是通過make_array允許運行時創建arrayBjarne Stroustrup,C++的創造者,waxed eloquent on the topic

我們需要運行時間限定的邊界和這樣的存儲安全訪問陣列「昨天」

可悲的是,對於斯特勞斯博士,美國和作爲一個整體的C++社區,沒有未來計劃用C++簡單的c99 VLA表單重新生成ARB/VLA。