Empty C ++ 11初始化列表导致带有一个默认构造对象的容器

时间:2014-01-17 15:24:13

标签: c++11

以下代码使用空的C + 11样式初始化程序。运行时,结果是std::vector包含一个项目,该项目似乎是默认构造的。

这显然是一个人为的案例,并且有更好的方法来构建空向量。 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

2 个答案:

答案 0 :(得分:7)

Container c;是一个空容器或Container c{};

Container c{{}};使用默认构造的std::shared_ptr<int>

构造容器

Container c{{},{}};构建了2 shared_ptr s

答案 1 :(得分:3)

初始化列表不是空的而不是Container c {{}};使用Container c({}); //传递初始化列表。容器c {}将默认初始化。