close

下一代的 C++ (之前的0x,現在已經變1x了)有一項我很喜歡的功能,雖然不會增加 C++ 能做的事,不過讓 C++ 更具易用性。這裡要說的是 initializer_list 和一致的初始化語法。

這份提案已經通過 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2531.pdf

並且已經納入最新的 C++ 標準草案當中 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3092.pdf

而且至少獲得GCC 4.4的支持 http://gcc.gnu.org/gcc-4.4/cxx0x_status.html

我知道大家和我一樣懶得讀文法和模型描述,所以這裡用幾個例子說明,下面這些將來都是合法的:


std::vector<int> nums = {0, 1, 2, 3};

new std::vector<std::string>{"once", "upon", "a", "time"};

std::map<std::string,int> anim = { {"bear", 4}, {"cassowary", 2}, {"tiger", 7} };

以往沒辦法初始化這些容器,只能先建構之後再寫一堆 push_back。雖然後來可以靠 boost.assign 來提供類似的語法,但遇到先天上的限制仍然力有未逮,例如 new 的初始化。

這個 initializer_list 還提供另一項好處,像是區隔下列兩者可以消彌一些人為錯誤


vector<int> v1(5);    // 建立大小為 5 個元素的vector
vector<int> v2{5};    // 建立大小為 1 個元素的vector,元素值為 5 

還有如前面所提,new[]可以順便初始化


int* pn = new int[4] {0, 1, 2, 3};

以及


class A
{
public:
   A() : arr_{0, 1, 2} {}
private:
   int arr_[5];
};

詳情請見標準草案的 8.5.4 List-initialization

唯一的缺點是又多出一大堆規則要記,讓 Scott Meyers 等人又可以大賺一筆。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 novus 的頭像
    novus

    novus log

    novus 發表在 痞客邦 留言(1) 人氣()