【问题标题】:container of non-copyable in std::optionalstd::optional 中不可复制的容器
【发布时间】:2018-08-06 02:44:00
【问题描述】:

我正在尝试将不可复制类型的 (STL-) 容器打包到 std::optional 中,例如。 g.:

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

但是编译器(GCC 7.2)抱怨

错误:使用已删除的函数 'MyClass::MyClass(const MyClass&)' { ::new((void *)__p) _Up(std::forward<_args>(__args)...); }
[...] 注意:在此声明
MyClass(const MyClass&) = 删除;

并呈现一个深入的“需要...”堆栈进入 type_traits (以及更多),它在 std::list 上检查 std::is_trivially_copy_constructible。我怀疑编译器在那里发现容器(示例中的 std::list)可以简单地复制构造,但没有检查容器的值类型是否可以简单构造,然后走错了路。

当然,std::optional 中的不可复制类型(不在容器中)有效:

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

我知道我可以解决这个问题。 G。像这样:

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;

但我想知道没有 CNonCopyable 类是否有更好的方法。

(仅作为不涉及自身类型的示例:)尝试将 std::unique_ptr 的容器打包到 std::optional 时也会发生同样的情况,因为 std::unique_ptr 不可复制构造:

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

【问题讨论】:

  • 也适用于 Clang 5.0。

标签: c++ c++17


【解决方案1】:

这是 GCC 中的一个错误,已被修补。

8119080654

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 2014-06-30
    • 2013-05-09
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多