如何构造非默认可构造对象的std :: vector?

Mar*_*dik 3 c++ c++11

我在C++参考页面中遇到过这样的代码:

#include <algorithm>
#include <list>
#include <vector>
#include <functional>

int main()
{
    std::list<int> l = {-4, -3, -2, -1, 0, 1, 2, 3, 4};
    std::vector<std::reference_wrapper<int>> v(l.begin(), l.end());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是"示例"部分的摘录.代码按预期编译和运行.但是怎么可能呢?这std::reference_wrapper<int>不是默认的可构造的.你怎么能做出std::vector这些事情?我一直把它想象std::vector成一个动态阵列.但是,如何通过OS以这样的方式初始化一个新近提供给你的内存块std::list呢?

这可能听起来像一个令人困惑的问题,但由于某种原因,我无法完全理解上面代码中发生的事情.那里发生了什么?

Luc*_*ore 6

它的工作原理是因为那里没有默认的初始化 - 列表中的元素用于复制初始化向量.

例如,以下内容不起作用:

std::vector<std::reference_wrapper<int>> v(42);
Run Code Online (Sandbox Code Playgroud)

  • @MartinDrozdik:有可能有一些限制.只要方法没有实例化,那就没关系; 但有时一个方法可以在没有你要求的情况下实例化,例如`virtual`方法总是被实例化. (3认同)