自定义类型为std :: atomic

时间:2018-10-05 15:23:57

标签: 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;
    };
}

它一直运行良好,直到我发现我忘记将默认构造函数中类的唯一成员初始化为零。因此,我删除了= default并提供了构造函数的实现

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

现在我遇到了编译器错误:

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

我的直觉是因为我现在提供了一个自定义构造函数,这使得默认的副本构造函数不再被隐式定义。

所以,我也将它添加到了类声明中

Unit(const Unit<T, R, D>& U) = default;

但是,我遇到了同样的错误。我不确定会怎样。我不确定编译器是指哪个删除的函数。

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:6)

这里的问题是您类型的异常保证。 Per this post/reference您的默认构造函数为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;
}

答案 1 :(得分:3)

一种解决方法是删除构造函数并使用default member initializers

template<class T>
struct Unit {
    T value = 0;
};

int main() {
    std::atomic<Unit<int>> a;
    std::atomic<Unit<int>> b = data = pd.read_excel("assignment1.xlsx")[:21]
;
}