gpt4 book ai didi

c++ - vector::push_back() 是否调用其类型 T 的任何匹配构造函数?

转载 作者:搜寻专家 更新时间:2023-10-31 01:27:09 24 4
gpt4 key购买 nike

我用了 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具有给定参数的构造函数。 Documentation虽然提到参数的类型是 T以及最终的复制/移动构造函数。

当我用 shared_ptr 尝试 1 和 2 时虽然:

    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)?

最佳答案

Why 2 and even 3 work but 6 doesn't?

std::vector::push_back 需要 T作为参数,那么如果你传递的东西可以转换为 T,它就会起作用含蓄地。

(2) 有效是因为 B可以转换为 std::reference_wrapper<B>含蓄地。 (3) 有效因为 A可以转换为 B含蓄地。 (6) 不起作用,因为 B*无法转换为 shared_ptr<B>含蓄地。注意 the constructor of shared_ptr taking raw pointers标记为 explicit .

Since 3 compiles and works just fine, would it be ok to use and count on it (if it wasn't a bad approach since there is the emplace_back)?

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

关于c++ - vector<T>::push_back() 是否调用其类型 T 的任何匹配构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53918969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com