代码之家  ›  专栏  ›  技术社区  ›  Ben

std::atomic中的自定义类型

  •  2
  • Ben  · 技术社区  · 7 年前

    我已经设置了一个自定义类 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 回复  |  直到 7 年前
        1
  •  6
  •   NathanOliver    7 年前

    这里的问题是你这种类型的例外保证。 Per this post/reference 您的默认构造函数是noexcept。当您添加自己的异常规范时,您没有提供异常规范,因此它不是 noexcept . 您需要做的是将其添加到默认构造函数中,因为 std::atomic 的默认构造函数标记为

    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;
    }
    
        2
  •  3
  •   Maxim Egorushkin    7 年前

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

    template<class T>
    struct Unit {
        T value = 0;
    };
    
    int main() {
        std::atomic<Unit<int>> a;
        std::atomic<Unit<int>> b = {{1}};
    }