【问题标题】:Boost lock free queue asserts for trivial assignment and destructor为琐碎的赋值和析构函数提升无锁队列断言
【发布时间】:2019-06-10 14:36:30
【问题描述】:

当尝试将“事件”插入到无锁加速队列中时,我收到: 错误:静态断言失败:(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)

【问题讨论】:

标签: c++ boost lock-free


【解决方案1】:

你的Event 类有一个std::string 类型的成员,它有一个非平凡的赋值运算符和一个非平凡的析构函数。这些阻止了Event 本身的自动生成的赋值运算符和析构函数变得微不足道。 (请记住,“琐碎”不仅仅意味着“默认”。它还意味着默认行为不必做任何有趣的事情。琐碎的赋值只是复制位;琐碎的析构函数是无操作的。)

【讨论】:

    【解决方案2】:

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

    一般来说,一个简单的默认构造函数的要求列在here

    【讨论】:

      【解决方案3】:

      std::string 没有普通的复制赋值运算符或普通的析构函数。因为它不是,而且它是您班级的成员,这意味着您的班级也不是。如果你想让它变得微不足道,你必须删除字符串成员。

      【讨论】:

        猜你喜欢
        • 2020-11-19
        • 1970-01-01
        • 2010-10-01
        • 2018-10-25
        • 2012-07-31
        • 2020-05-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多