簡體   English   中英

std :: optional中不可復制的容器

[英]container of non-copyable in std::optional

我正在嘗試將一個不可復制類型的(STL-)容器打包到std :: optional中,例如:

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&)=刪除;

並提供一個深入的“required from ...”堆棧進入type_traits(以及更多),它在std :: list上檢查std :: is_trivially_copy_constructible。 我懷疑編譯器發現容器(示例中的std :: list)可以簡單地復制可構造但不檢查容器的值類型是否具有普通的可構造性,然后走錯了路徑。

當然std :: optional中的不可復制類型(不在容器中)起作用:

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;

但我想知道沒有CNonCopyable類是否有更好的方法。

(就像沒有涉及自己的類型的例子一樣)當嘗試將std :: unique_ptr的容器打包到std :: optional中時會發生同樣的情況,因為std :: unique_ptr不是可復制構造的:

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

這是GCC中的一個錯誤,此后已被修補。

8119080654

使用較新版本的GCC(例如,8),您將不會遇到此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM