std::vector 范围构造函数 [start, end) 是否复制或仅引用数据?

SDw*_*rfs 5 c++ stdvector language-lawyer

我想知道 std::vector 的范围构造函数是否复制数据,或者只是引用它?

看看这个例子:

vector<int> getVector() {
    int arr[10];
    for(int i=0; i<10; ++i) arr[i] = i;
    return vector<int>(arr, arr+10);
}
Run Code Online (Sandbox Code Playgroud)

这会导致错误(由于分发了对稍后被销毁的堆栈的引用)还是可以,因为它复制了构造函数中的数据?

编辑#1

为了澄清:我正在寻找或多或少的官方资源来指出构造函数的以下哪些伪代码实现是有效的。我知道构造函数的签名是不同的......但是,你应该明白。

版本A(仅在内部使用给定的数据)

   template<typename T>
   class vector {
   private:
     T* data;
     int size;
   public:
     vector<T>(T* start, T* end) {
       data = start;
       size = (end - start);
     }
   };
Run Code Online (Sandbox Code Playgroud)

版本 B(显式复制数据)

   template<typename T>
   class vector {
   private:
     T* data;
     int size;
   public:
     vector<T>(T* start, T* end) {
       for(T* it = start; it < end; ++it) push_back(*it);
     }
   };
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 0

例如,该向量不能被定义为参考向量std::vector<int &>。所以代码是有效的。该向量不包含对数组元素的引用。它创建该类型的新元素int(作为向量的模板参数)而不是引用向量。

  • 或者 `std::vector&lt;ref&lt;int&gt;&gt;`。但问题不在于向量元素类型,而在于 `std::vector` 是否包装对现有数据的访问,如 `std::string_view`,还是维护自己的副本。 (3认同)
  • 矢量是就地访问数据还是复制数据才是整个问题。 (3认同)
  • 与任何可调整大小的容器一样,“std::vector”必须指向其自身对象外部的数据(这可以通过注意到“sizeof(std::vector&lt;int&gt;)”是一个常量来简单地证明)。问题是它是就地指向源数据,还是制作一个副本并指向副本。后者是现实,但对元素类型的任何推理都无法帮助您实现这一目标。 (2认同)