Zeb*_*ish 20 c++ constructor stdvector
我遇到一个编译错误,说:
试图引用已删除的功能
#include <iostream>
#include <vector>
template <typename T>
struct Container
{
Container() = default;
Container(const Container& other) = delete;
Container(T* ptr) : ptr(ptr) {}
T* ptr;
~Container() { delete ptr; }
};
struct Foo { Foo(int a, int b) {} };
int main()
{
std::vector<Container<Foo>> myvector;
myvector.push_back(new Foo(1, 2)); // I understand why this doesn't work.
myvector.emplace_back((new Foo(1, 2))); // I don't understand why this fails
}
Run Code Online (Sandbox Code Playgroud)
我理解为什么它会在我做的时候尝试引用已删除的构造函数std::vector::push_back(),因为这会复制并需要调用我删除的复制构造函数.
但是std::vector::emplace_back()应该采用它所拥有的类型的构造函数参数.当我向后移动时,我给它一个指向a的指针Foo,这应该转发给Container::Container(T* ptr)构造函数.
我错过了什么?
Whi*_*TiM 19
声明用户定义的复制构造函数不会定义隐式移动构造函数 ; T必须拥有一个拷贝构造函数或转移构造到push_back或emplace_back*物体进入std::vector<T>.
从文档中,查看T实例化a 的要求std::vector<T>.(这里没有限制,请继续阅读).强调我的
对元素施加的要求取决于对容器执行的实际操作.通常,要求元素类型满足Erasable的要求,但许多成员函数强加了更严格的要求.如果分配器满足分配器完整性要求,则可以使用不完整的元素类型实例化此容器(但不是其成员).
来自std::vector<...>::push_back:
类型要求
T必须满足CopyInsertable的要求才能使用overload(1).T必须满足MoveInsertable的要求才能使用overload(2).
来自std::vector<...>::emplace_back:
类型要求
T(容器的元素类型)必须满足MoveInsertable和EmplaceConstructible的要求.
在emplace_back这里,您的代码将满足EmplaceConstructible标准,但是,因为可以发生reallcations,所以您必须同样满足MoveInsertable.