用于简单分配和析构函数的Boost无锁队列断言

时间:2019-06-10 14:36:30

标签: c++ boost lock-free

当尝试将“事件”插入到无助推锁定队列时,我收到: 错误:静态声明失败:(boost :: has_trivial_destructor :: value)和静态声明失败:(boost :: has_trivial_assign :: value)。我知道容器的要求是: T必须具有复制构造函数 T必须有一个琐碎的赋值运算符 T必须有一个琐碎的析构函数 我不确定为什么我的活动课程不符合这些要求。

我已阅读以下问题/答案:/boost/lockfree/queue.hpp: error: static assertion failed: (boost::has_trivial_destructor<T>::value)。我不明白为什么我的课堂不满足要求。

struct Event
{
    typedef uint8_t Event_Type;

    //event bitmask..
    enum : uint8_t
    {
        SS      = 1,
        TS      = 2
    };

    static constexpr uint8_t BOTH = SS | TS;

    Event():      _time {}
                  ,_data1 {}
                  ,_eventType {}
                  ,_data2 {}
    {}

    Event(const Event& event_)
    {
        _id                  = event_._id;
        _time                = event_._time;
        _data1                = event_.data1;
        _eventType           = event_._eventType;
        _data2                = event_.data2;
    }

    template<Event_Type type, typename... Args >
    void update(Args...args)
    {
        _eventType |= type;
        apply(std::forward<Args>(args)...);
    }

    void apply(int32_t d)
    {
        data1 = d;
    }

    void apply(bool b)
    {
        data2= b;
    }

    template<typename Event, typename... Args>
    void apply(Event event, Args... args)
    {
        apply(event);
        apply(args...);
    }

    std::string                _id;
    int64_t                    _time;
    int32_t                    _data1;
    Event_Type                 _eventType;
    bool                       _data2;
};

boost::lockfree::queue<Event, boost::lockfree::fixed_sized<false>> q;
Event e;
e._id="test";    
q.push(event);

/boost/1.57.0/include/boost/static_assert.hpp:78:41:错误:静态断言失败:(boost :: has_trivial_destructor :: value)  #定义BOOST_STATIC_ASSERT(...)static_assert( VA_ARGS ,# VA_ARGS

boost / 1.57.0 / include / boost / static_assert.hpp:78:41:错误:静态断言失败:(boost :: has_trivial_assign :: value)  #定义BOOST_STATIC_ASSERT(...)static_assert( VA_ARGS ,# VA_ARGS

3 个答案:

答案 0 :(得分:3)

您的Event类具有类型std::string的成员,该成员具有非平凡的赋值运算符和非平凡的析构函数。这些阻止了自动生成的Event本身的赋值运算符和析构函数的重要性。 (请记住,“琐碎的”不仅仅意味着“默认”。这还意味着默认行为不必做任何有趣的事情。琐碎的分配只是复制位;琐碎的析构函数是无操作的。) / p>

答案 1 :(得分:1)

std::string没有平凡的副本分配运算符或平凡的析构函数。因为它不是您的课程,并且它是您课程的成员,所以您的课程也不是这样。如果要使字符串成员变得微不足道,则必须删除它。

答案 2 :(得分:1)

除了其他两个答案指出std::string数据成员阻止构造函数不重要之外,Event()构造函数本身也必须不重要。这意味着它必须由编译器生成,而不由用户实现。可以通过完全删除构造函数或将其标记为显式默认(Event() = default;)来实现。复制构造函数和赋值运算符也是如此。

通常,here列出了琐碎的默认构造函数的要求。