为什么这个 std::vector::emplace_back 失败了?
Why does this std::vector::emplace_back fail?
我遇到了一个编译器错误,上面写着:
尝试引用已删除的函数
#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
}
我理解为什么当我做std::vector::push_back()
时它说试图引用已删除的构造函数,因为这会执行复制并且需要调用我删除的复制构造函数。
但是std::vector::emplace_back()
应该采用它所持有的类型的构造函数参数。当我放置回来时,我给它一个指向Foo
的指针,这应该转发给Container::Container(T* ptr)
构造函数。
我错过了什么?
声明用户定义的复制构造函数不会定义隐式移动构造函数;T
必须具有复制构造函数或移动构造函数才能push_back
对象或将对象emplace_back*
到std::vector<T>
中。
从文档中,请参阅实例化std::vector<T>
的T
要求。(这里没有限制,请继续阅读)..强调我的
对元素施加的要求取决于对容器执行的实际操作 。通常,要求元素类型满足可擦除的要求,但许多成员函数提出了更严格的要求。如果分配器满足分配器完整性要求,则可以使用不完整元素类型实例化此容器(但不是其成员)。
从std::vector<...>::push_back
:
类型要求
T
必须满足CopyInsertable的要求才能使用重载 (1)。T
必须满足MoveInsertable的要求才能使用重载 (2)。
从std::vector<...>::emplace_back
:
类型要求
T
(容器的元素类型)必须满足MoveInsertable和EmplaceConstructible的要求。
对于此处的emplace_back
,您的代码将满足EmplaceConstructible标准,但是,由于可能会发生现实,因此您必须同样满足MoveInsertable。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 生成MRPT库时cmake配置失败
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- variadic模板中的模板参数推导失败