2012-01-14 88 views
12

A std::array<T>本質上是一個包裝在struct中的C型陣列。 struct的初始化需要大括號,並且數組的初始化也需要大括號。所以,我需要2雙括號:std :: array <T>初始化

std::array<int, 5> a = {{1, 2, 3, 4, 5}}; 

但大部分我所看到的例子代碼只使用一對大括號:

std::array<int, 5> b = {1, 2, 3, 4, 5}; 

如何走到這是不能允許的,它有什麼好處或與第一次接觸相比有什麼缺點?

+0

我不知道它_is_標準允許 - 可能接受該代碼的編譯器是基於早期的C^++ 11草案,或者只是給出一個警告,因爲它是一個允許不合格代碼的擴展。 – ildjarn 2012-01-14 15:55:57

+0

@ildjarn根據約翰內斯,它是允許的。 – fredoverflow 2012-01-14 16:10:21

回答

14

好處是你有...少打字。但缺點是隻有在聲明具有這種形式時,才允許你留下大括號。如果您離開=,或者如果陣列是成員,並且您使用member{{1, 2, 3, 4, 5}}初始化它,則不僅可以傳遞一對大括號。

這是因爲當花括號傳遞給函數時,擔心可能出現過載歧義,如f({{1, 2, 3, 4, 5}})。但是它引起了一些討論並且生成了問題報告。

從本質上講,= { ... }初始化一直是能夠省略大括號,如

int a[][2] = { 1, 2, 3, 4 }; 

這不是新的。新的情況是,你可以省略=,但你必須指定所有牙套

int a[][2]{ {1, 2}, {3, 4} }; 
+0

你能提供一個標準的報價,證明只有一對大括號? – fredoverflow 2012-01-14 16:01:28

+1

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1270 – 2012-01-14 16:06:39

相關問題