当前位置: 首页 > 知识库问答 >
问题:

std中不可复制的容器::可选

苗康平
2023-03-14

我试图将不可复制类型的(STL-)容器打包到std::可选,例如:

class MyClass
{
    MyClass(const MyClass&) = delete;
};
std::optional<std::list<MyClass>> optContainer;

但是编译器(GCC 7.2)抱怨

错误:使用已删除的函数“MyClass::MyClass(const MyClass

并呈现出深刻的“来自……”堆栈进入类型_traits(以及更多),它检查std::是否可以在std::列表上构建。我怀疑编译器在那里发现容器(示例中的std::list)是可复制可构造的,但没有检查容器的值类型是否具有可构造性,然后走错了路径。

当然,不可复制的类型(不在容器中)在std::可选工作:

std::optional<MyClass> optValue; // ok

我知道我可以解决这个问题,例如:

template<typename T>
class CNonCopyable : public T
{
public:
    template<typename... Params>
    CNonCopyable(Params&&... params)
        : T(std::forward<Params>(params)...)
    {}
    CNonCopyable(const CNonCopyable&) = delete;
    CNonCopyable(CNonCopyable&&) = default;
    virtual ~CNonCopyable() = default;
    CNonCopyable& operator=(const CNonCopyable&) = default;
    CNonCopyable& operator=(CNonCopyable&&) = default;
};
std::optional<CNonCopyable<std::list<MyClass>>> optContainer;

但我想知道是否有更好的方法不用Cnoncoyable类。

(就像一个不涉及自己类型的例子:)当试图将std::unique_ptr的容器打包到std::optional时,也会发生同样的情况,因为std::unique_ptr是不可复制构造的:

std::optional<std::list<std::unique_ptr<int>>> optContainer;

共有1个答案

虞唯
2023-03-14

这是GCC中的一个漏洞,后来被修补。

参见81190和80654

使用更新版本的GCC(例如8),您将不会遇到该问题。

 类似资料:
  • 我正在使用Ubuntu18:04和lxc/lxd蒸汽容器。它工作得很好,我遵循了本教程,并对网络内容做了一些更改。 https://blog.simos.info/running-steam-in-a-lxd-system-container/ 蒸汽适用于opengl游戏,但不适用于沃肯游戏。卢特里斯也一样。 主办方: 集装箱侧: ubuntu@steam:~$vulkaninfo OpenGL工

  • 我正在使用STD::UNIQUE_PTR在类上创建一些公共成员,这些成员必须是不可复制或可移动的。但是STD::UNIQUE_PTR是可移动的,我想知道如果有人移动STD::UNIQUE_PTR包含的指针,然后我尝试访问被移动的那个类的STD::UNIQUE_PTR成员,会发生什么。 我所需要的就是使std::unique_ptr不可移动,并简单地保存一个唯一的指针,该指针不能从拥有它的类中移动或

  • 数据表格的表头菜单字段里,勾选“字段内容不允许重复”后,将会对本图层该属性字段值进行去重比较,如果新填写的内容有和之前填写内容重复的,将不能保存

  • 本文向大家介绍Docker 限制容器可用的CPU的方式,包括了Docker 限制容器可用的CPU的方式的使用技巧和注意事项,需要的朋友参考一下 默认情况下容器可以使用的主机 CPU 资源是不受限制的。和内存资源的使用一样,如果不对容器可以使用的 CPU 资源进行限制,一旦发生容器内程序异常使用 CPU 的情况,很可能把整个主机的 CPU 资源耗尽,从而导致更大的灾难。本文将介绍如何限制容器可以使用

  • 我想混淆(*)一些密码,以便将它们隐藏在Java源代码中。 发现jasypt,我想我事先加密了密码文本,然后在源代码中从记住的种子+加密密码中解密。但是,加密过程似乎不是可复制的:当使用 每次运行时,我都会返回不同的加密密码:、或。 我如何使加密可复制,这样我就可以使用种子加加密字符串来生成真正的密码? (*)我使用“混淆”,因为我知道这根本不是一种隐藏密码的安全方法,但至少它可以帮助人们在将密码