首页 文章

创建一个boost :: asio定时器的std :: vector会使编译失败

提问于
浏览
2

Coliru上的GCC 4.7.3和4.8.0都无法编译以下代码 . 看起来 asio 计时器不可移动:

#include <vector>
#include <chrono>
#include <boost/asio.hpp>
#include <boost/asio/system_timer.hpp>

int main() {
    boost::asio::io_service io;    
    boost::asio::system_timer t{io}; // works
    std::vector<boost::asio::system_timer> timers;
    timers.emplace_back(io); // timer cannot be constrcuted in place
    timers.push_back(std::move(t)); // cannot be moved as well
}

你知道创建定时器矢量的原因和方法吗?在我的例子中,一种解决方案是使用唯一指针的向量,但我更愿意避免这种情况 .

编译器的错误是:

在/ usr / include / c /4.8/vector:62:0中包含的文件中,来自main.cpp:1:
/ usr / include / c /4.8/bits/stl_construct.h:实例化'void std :: _ Construct(T1 *, Args && ...)[with _T1 = boost :: asio :: basic_waitable_timer _Args = {boost :: asio :: basic_waitable_timer,boost :: asio :: waitable_timer_service >>]}':/ usr / include / c /4.8/bits/stl_uninitialized.h:75:53:从'static ForwardIterator std :: _ uninitialized_copy <TrivialValueTypes>中需要: :_uninit_copy(_InputIterator,_InputIterator,_ForwardIterator)[with _InputIterator = std :: move_iterator *> _ForwardIterator = boost :: asio :: basic_waitable_timer *; bool _TrivialValueTypes = false]'/ usr / include / c /4.8/bits/stl_uninitialized.h:117:41:需要'_ForwardIterator std :: uninitialized_copy(_InputIterator,_InputIterator,_ForwardIterator)[with _InputIterator = std :: move_iterator *> _ForwardIterator = boost :: asio :: basic_waitable_timer *]'/ usr / include / c /4.8/bits/stl_uninitialized.h:258:63:来自'ForwardIterator std :: _ uninitialized_copy_a(_InputIterator,_InputIterator,_ForwardIterator,std :: allocator) <_Tp>&)[with _InputIterator = std :: move_iterator *> _ForwardIterator = boost :: asio :: basic_waitable_timer *; _Tp = boost :: asio :: basic_waitable_timer]'/ usr / include / c /4.8/bits/stl_uninitialized.h:281:69:需要'ForwardIterator std :: _ uninitialized_move_if_noexcept_a(_InputIterator,_InputIterator,_ForwardIterator,_Allocator&)[with _InputIterator = boost :: asio :: basic_waitable_timer *; _ForwardIterator = boost :: asio :: basic_waitable_timer *; _Allocator = std :: allocator]'/ usr / include / c /4.8/bits/vector.tcc:415:43:需要'void std :: vector <Tp,Alloc> :: _ M_emplace_back_aux( Args && ...)[ with _Args = {boost :: asio :: io_service&}; _Tp = boost :: asio :: basic_waitable_timer _Alloc = std :: allocator]'/ usr / include / c /4.8/bits/vector.tcc:101:54:从'void std :: vector <Tp,Alloc>中需要: :emplace_back( Args && ...)[with _Args = {boost :: asio :: io_service&}; _Tp = boost :: asio :: basic_waitable_timer _Alloc = std :: allocator]'main.cpp:10:27:从这里需要/ usr / include / c /4.8/bits/stl_construct.h:75:7:错误:使用删除函数'boost :: asio :: basic_waitable_timer :: basic_waitable_timer(boost :: asio :: basic_waitable_timer &&)'{:: new(static_cast <void *>( p))T1(std :: forward <Args>( args) ...); }

^
在/usr/local/include/boost/asio.hpp:33:0中包含的文件中,来自main.cpp:3:
/usr/local/include/boost/asio/basic_waitable_timer.hpp:127:7:注意:'boost :: asio :: basic_waitable_timer :: basic_waitable_timer(boost :: asio :: basic_waitable_timer &&)'被隐式删除,因为默认定义会形象不对:class basic_waitable_timer ^
在/usr/local/include/boost/asio/basic_socket.hpp:20:0中包含的文件中,来自/usr/local/include/boost/asio/basic_datagram_socket.hpp:20,

来自/usr/local/include/boost/asio.hpp:21,

来自main.cpp:3:
/usr/local/include/boost/asio/basic_io_object.hpp:163:3:错误:'boost :: asio :: basic_io_object :: basic_io_object(const boost :: asio :: basic_io_object&)[with IoObjectService = boost :: asio :: waitable_timer_service> bool Movable = false]'是私有的basic_io_object(const basic_io_object&); ^在/usr/local/include/boost/asio.hpp:33:0中包含的文件中,来自main.cpp:3:
/usr/local/include/boost/asio/basic_waitable_timer.hpp:127:7:错误:在此上下文类basic_waitable_timer中^

1 回答

  • 4

    ASIO尚未使用移动语义(或至少部分内容)进行更新,因此计时器不可移动 . 所以你的选择是

    • 使用 unique_ptr .

    • 使用不需要元素的容器可以移动所有操作,如 dequelist .

    这看起来像这样:

    #include <deque>
    #include <chrono>
    #include <boost/asio.hpp>
    #include <boost/asio/system_timer.hpp>
    
    int main() {
        boost::asio::io_service io;    
        boost::asio::system_timer t{io}; // works
        std::deque<boost::asio::system_timer> timers;
        timers.emplace_back(io); // should work
        timers.push_back(std::move(t)); // won't work
    }
    

    但是不要试图使用 inserterase 作为集合,因为那些需要可移动性 .

相关问题