std :: atomic中的自定义类型

Ben*_*Ben 2 c++ constructor atomic copy-constructor stdatomic

我把一个自定义类Unit放在一个std::atomic.使用默认构造函数,类看起来如下所示

namespace Base
{
    template <typename T, typename R, typename D>
    class Unit
    {
    public: 
        constexpr Unit() = default;
    private:
        T m_Value;
    };
}
Run Code Online (Sandbox Code Playgroud)

它曾经工作正常,直到我注意到我忘了在默认构造函数中将我的类的唯一成员初始化为零.因此我删除了= default并提供了构造函数的实现

template <typename T, typename R, typename D>
constexpr Unit<T, R, D>::Unit() :
    m_Value(T(0))
{   }
Run Code Online (Sandbox Code Playgroud)

现在我收到编译器错误:

Error C2280 'std::atomic<Base::Unit>::atomic(void) noexcept': attempting to reference a deleted function

我的预感是因为我现在提供了一个自定义构造函数,这导致默认的复制构造函数不再被隐式定义.

所以,我也把这个添加到了类声明中

Unit(const Unit<T, R, D>& U) = default;
Run Code Online (Sandbox Code Playgroud)

但是,我得到了同样的错误.我不确定我能成为什么样的人.我不确定编译器指的是哪个删除的函数.

任何帮助,将不胜感激

Nat*_*ica 6

这里的问题是您的类型的例外保证. 根据这篇文章/参考,您的默认构造函数是noexcept.添加自己的时,不提供异常规范,因此不提供noexcept.您需要做的是将其添加到默认构造函数,因为std::atomic默认构造函数标记为noexcept

namespace Base
{
    template <typename T, typename R, typename D>
    class Unit
    {
    public:
        constexpr Unit() noexcept;
    private:
        T m_Value;
    };

    template <typename T, typename R, typename D>
    constexpr Unit<T, R, D>::Unit() noexcept :
        m_Value(T(0))
    {   }
}

int main() 
{
    std::atomic<Base::Unit<int, int, int>> foo;
}
Run Code Online (Sandbox Code Playgroud)