Я недавно использовал 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*)'
- Почему 2 и даже 3 работают, а 6 нет?
- Должен быть
shared_ptr<B>
конструктор, который принимает B*
в качестве параметране так ли?Итак, почему 6 не компилируется (так как 3 не компилируется)? - Поскольку 3 компилируется и работает просто отлично, было бы нормально использовать и рассчитывать на это (если это не был плохой подход, так как есть
emplace_back
)?