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

mar*_*rko 4 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Vector size is: 1
Item: 0x0
Program ended with exit code: 0
Run Code Online (Sandbox Code Playgroud)

编译:

$ clang  --version
Apple clang version 3.0 (tags/Apple/clang-211.12) (based on LLVM 3.0svn)
Target: x86_64-apple-darwin12.4.0
Run Code Online (Sandbox Code Playgroud)

Dmi*_*sov 7

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

Container c{{}}; 用默认构造的方法构造容器 std::shared_ptr<int>

Container c{{},{}};构造2 shared_ptrs