vector <T> :: push_back()是否调用任何类型为T的匹配构造函数?

瓦西利斯

reference_wrapper最近用过这样的:

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

struct A {
};

struct B {
    B() {};
    B(A& aA) {};
    B(const B&) = default;
};

int main () {
    A a;
    B b;

    std::vector<std::reference_wrapper<B>> rvector;
    rvector.push_back(std::reference_wrapper<B>(b)); // (1)
    rvector.push_back(b); // (2)

1和2都可以正常编译和工作,我想知道哪一种是正确的!所以我认为以下方法也可以工作:

    std::vector<B> bvector;
    bvector.push_back(a); // (3)
    bvector.push_back(b); // (4)
    std::cout << bvector.size() << "\n";

是的,它有效!因此,我得出的结论是,push_backT使用给定的参数调用类型的构造函数。尽管文档中提到该参数是类型T,最后是复制/移动ctor。

当我尝试使用1和2时shared_ptr

    std::vector<std::shared_ptr<B>> pvector;
    pvector.push_back(std::shared_ptr<B>(new B())); // (5)
    pvector.push_back(new B()); // (6)

我懂了

no matching function for call to 'std::vector<std::shared_ptr<B> >::push_back(B*)'
  • 为什么2甚至3可以工作,而6却不能呢?
  • 应该有一个shared_ptr<B>B*参数为参数构造函数,不是吗?那么,为什么6不编译(因为3编译)?
  • 由于3可以编译并正常工作,因此可以使用并依靠它(如果有的话这不是一个坏方法emplace_back)吗?
songyuanyao

为什么2甚至3可以工作,而6却不能呢?

std::vector::push_back接受T作为参数,那么如果您传递可以T隐式转换为某些内容的东西,它将起作用

(2)可以工作,因为B可以std::reference_wrapper<B>隐式转换为(3)可以工作,因为A可以B隐式转换为(6)不起作用,因为B*无法shared_ptr<B>隐式转换为请注意,采用原始指针的构造函数shared_ptr被标记为explicit

由于3可以正常编译和工作,因此可以使用它并依靠它(如果由于emplace_back的存在,这不是一个坏方法)吗?

是的,您可以使用它,但是请注意,emplace_back有时会更有效;它将直接在原位构造元素,而不进行任何隐式转换,而不是构造一个临时元素,T然后将其移至vector(as push_back)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在自定义Vector <T>类中实现push_back(T && c)

std :: vector是否使用push_back复制对象?

是否有一个比vector <vector <T >>更自然的方式来表示T的矩阵?

缺少System.Numerics.Vectors.Vector <T>

为什么Vector <T> .Count是静态的?

为什么连续的vector :: push_back结果导致不同数量的构造函数调用?

将vector <T *>移动到vector <const T *>

模板函数中的输出vector <T>

push_back到std :: vector,复制构造函数被重复调用

为什么vector <T> :: emplace_back(例如T具有已删除的副本构造函数)无法编译?

为什么使用std :: vector :: push_back的move变体调用被移动项的副本构造函数?

AddressSanitizer将std :: vector <T> :: push_back标识为释放后使用堆错误的原因

为什么要在std :: vector :: push_back(T object)方法中构造对象时调用析构函数?

C ++-将vector <T>转换为vector <array <T >>

std :: vector中push_back函数的奇怪语法

如果禁用了异常,std :: vector <T>是否可以使用T的move构造函数?

错误:没有匹配的函数调用vector :: push_back

shared_ptr <T>到shared_ptr <T const>,vector <T>到vector <T const>

填充std :: vector时出现“ vector <T>太长”错误

用std :: vector <T *>控制内存

C ++ vector <T> v,vector <T> * v,vector <T *> vec,哪个最快(或最高效)?

将矩阵`shared_ptr <vector <vector <T <>>>>的行((* sp)[i])传递给接受`shared_ptr <vector <T >>`的函数

将 std::vector<T> 转换为 char *

C++:从 vector<vector<T>> 获取 T**

如何从 Vector[T] 推断参数 T

Emscripten 类构造函数采用 std::vector<T>

C++ - 在 foreach 中复制向量给出“没有匹配的函数来调用 std::vector<int>::push_back(std::vector<int>&)”

错误:没有用于调用“std::vector<float>::push_back(std::vector<float>&) const”的匹配函数

错误:没有用于调用“std::vector<Movie>::erase(size_t&)”的匹配函数