2014-01-17 15 views
4

下面的代碼使用空的C + 11樣式初始化程序。運行結果是一個std::vector包含一個項目,似乎是默認構造。空C++ 11初始化列表導致容器中有一個默認構造對象

這顯然是一個仿真案例,並且有更好的方法來構造一個空向量。 Nonetheles,這種行爲是違反直覺的。這是一個編譯器/ c + +運行時庫錯誤?

我懷疑其中一個std::vector的其他構造函數實際上是在這裏調用的。

#include <iostream> 
#include <memory> 
#include <vector> 

int main(int argc, const char * argv[]) 
{ 
    typedef std::vector<std::shared_ptr<int>> Container; 

    Container c{{}}; 

    std::cout << "Vector size is: " << c.size() << std::endl; 

    for (auto item: c) 
    { 
     std::cout << "Item: " << item.get() << std::endl; 
    } 
} 

輸出:

Vector size is: 1 
Item: 0x0 
Program ended with exit code: 0 

編譯器:

$ clang --version 
Apple clang version 3.0 (tags/Apple/clang-211.12) (based on LLVM 3.0svn) 
Target: x86_64-apple-darwin12.4.0 
+0

'Container c {{}};'用一個元素'{}'構造一個向量(std :: shared'的默認構造函數)。 – Jarod42

+0

我認爲在這種情況下,矢量只是用一個默認構造元素'{{}}'的列表進行初始化。你想要的是一個空列表{{}'。 –

回答

7

Container c;是一個空的容器或Container c{};

Container c{{}};構造一個具有默認構造std::shared_ptr<int>

容器個

Container c{{},{}};構建體2 shared_ptr小號

+1

這讓我想要創建一個在構造上採用peano整數的類型。 '{{{{}},{}},{{}},{}}' – Yakk

3

的初始化列表不爲空,而不是容器C {{}};使用Container c({}); //傳遞一個初始化列表。容器c {}將被默認初始化。

相關問題