我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_back
仅T
使用给定的参数调用类型的构造函数。尽管文档中提到该参数是类型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*)'
shared_ptr<B>
以B*
参数为参数的构造函数,不是吗?那么,为什么6不编译(因为3编译)?emplace_back
)吗?为什么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] 删除。
我来说两句