C++11 创建boost::asio计时器的std::vector会导致编译失败

C++11 创建boost::asio计时器的std::vector会导致编译失败,c++11,boost,boost-asio,C++11,Boost,Boost Asio,Coliru上的GCC4.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_tim

Coliru上的GCC4.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
}
#包括
#包括
#包括
#包括
int main(){
boost::asio::io_服务io;
boost::asio::system_timer t{io};//工作正常
向量定时器;
timers.emplace_back(io);//计时器无法就地构造
timers.push_back(std::move(t));//也不能移动
}
你知道为什么要创建一个计时器向量吗?在我的例子中,一种解决方案是使用唯一指针的向量,但我更愿意避免这种情况

编译器的错误是:

 In file included from /usr/include/c++/4.8/vector:62:0,
 
                  from main.cpp:1:
 
 /usr/include/c++/4.8/bits/stl_construct.h: In instantiation of 'void
 std::_Construct(_T1*, _Args&& ...) [with _T1 =
 boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>
 _Args = {boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock,
 boost::asio::wait_traits<std::chrono::_V2::system_clock>,
 boost::asio::waitable_timer_service<std::chrono::_V2::system_clock,
 boost::asio::wait_traits<std::chrono::_V2::system_clock> > >}]':
 
 /usr/include/c++/4.8/bits/stl_uninitialized.h:75:53:   required from
 'static _ForwardIterator
 std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = std::move_iterator<boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>*>
 _ForwardIterator = boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>*;
 bool _TrivialValueTypes = false]'
 
 /usr/include/c++/4.8/bits/stl_uninitialized.h:117:41:   required from
 '_ForwardIterator std::uninitialized_copy(_InputIterator,
 _InputIterator, _ForwardIterator) [with _InputIterator = std::move_iterator<boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>*>
 _ForwardIterator = boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>*]'
 
 /usr/include/c++/4.8/bits/stl_uninitialized.h:258:63:   required from
 '_ForwardIterator std::__uninitialized_copy_a(_InputIterator,
 _InputIterator, _ForwardIterator, std::allocator<_Tp>&) [with _InputIterator = std::move_iterator<boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>*>
 _ForwardIterator = boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>*;
 _Tp = boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>]'
 
 /usr/include/c++/4.8/bits/stl_uninitialized.h:281:69:   required from
 '_ForwardIterator
 std::__uninitialized_move_if_noexcept_a(_InputIterator,
 _InputIterator, _ForwardIterator, _Allocator&) [with _InputIterator = boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>*;
 _ForwardIterator = boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>*;
 _Allocator = std::allocator<boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>
 >]'
 
 /usr/include/c++/4.8/bits/vector.tcc:415:43:   required from 'void
 std::vector<_Tp, _Alloc>::_M_emplace_back_aux(_Args&& ...) [with _Args
 = {boost::asio::io_service&}; _Tp = boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>
 _Alloc = std::allocator<boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>
 >]'
 
 /usr/include/c++/4.8/bits/vector.tcc:101:54:   required from 'void
 std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args =
 {boost::asio::io_service&}; _Tp =
 boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>
 _Alloc = std::allocator<boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>
 >]'
 
 main.cpp:10:27:   required from here
 
 /usr/include/c++/4.8/bits/stl_construct.h:75:7: error: use of deleted
 function
 'boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>::basic_waitable_timer(boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>&&)'
 
      { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
 
        ^
 
 In file included from /usr/local/include/boost/asio.hpp:33:0,
 
                  from main.cpp:3:
 
 /usr/local/include/boost/asio/basic_waitable_timer.hpp:127:7: note:
 'boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>::basic_waitable_timer(boost::asio::basic_waitable_timer<std::chrono::_V2::system_clock>&&)'
 is implicitly deleted because the default definition would be
 ill-formed:
 
  class basic_waitable_timer
 
        ^
 
 In file included from
 /usr/local/include/boost/asio/basic_socket.hpp:20:0,
 
                  from /usr/local/include/boost/asio/basic_datagram_socket.hpp:20,
 
                  from /usr/local/include/boost/asio.hpp:21,
 
                  from main.cpp:3:
 
 /usr/local/include/boost/asio/basic_io_object.hpp:163:3: error:
 'boost::asio::basic_io_object<IoObjectService,
 Movable>::basic_io_object(const
 boost::asio::basic_io_object<IoObjectService, Movable>&) [with
 IoObjectService =
 boost::asio::waitable_timer_service<std::chrono::_V2::system_clock,
 boost::asio::wait_traits<std::chrono::_V2::system_clock> > bool
 Movable = false]' is private
 
    basic_io_object(const basic_io_object&);
 
    ^
 
 In file included from /usr/local/include/boost/asio.hpp:33:0,
 
                  from main.cpp:3:
 
 /usr/local/include/boost/asio/basic_waitable_timer.hpp:127:7: error:
 within this context
 
  class basic_waitable_timer
 
        ^
在/usr/include/c++/4.8/vector:62:0中包含的文件中,
来自main.cpp:1:
/usr/include/c++/4.8/bits/stl_construct.h:在“void”的实例化中
std::_构造(_T1*,_参数&&…[带_T1=
boost::asio::基本可等待计时器
_Args={boost::asio::basic_waitable_timer}]':
/usr/include/c++/4.8/bits/stl_未初始化。h:75:53:需要从
'静态_ForwardIterator
std::uuu未初始化\u复制::uuu未初始化\u复制(u输入迭代器,u输入迭代器,u转发迭代器)[带u输入迭代器=std::移动迭代器]
_ForwardIterator=boost::asio::basic_waitable_timer*;
bool ValueTypes=false]'
/usr/include/c++/4.8/bits/stl_未初始化。h:117:41:需要从
“\u ForwardIterator std::未初始化的\u副本(\u InputIterator,
_InputIterator,_ForwardIterator)[带_InputIterator=std::move_迭代器
_ForwardIterator=boost::asio::basic_waitable_timer*]'
/usr/include/c++/4.8/bits/stl_未初始化。h:258:63:需要从
“\u ForwardIterator std::\u未初始化\u复制\u a(\u InputIterator,
_InputIterator,_ForwardIterator,std::allocator&[带_InputIterator=std::move\u迭代器
_ForwardIterator=boost::asio::basic_waitable_timer*;
_Tp=boost::asio::基本可等待计时器]'
/usr/include/c++/4.8/bits/stl_未初始化。h:281:69:从
“\u前向迭代器
std::\u未初始化\u移动\u如果没有异常\u a(\u输入程序,
_InputIterator、_ForwardIterator、_Allocator&[带_InputIterator=boost::asio::basic_waitable_timer*;
_ForwardIterator=boost::asio::basic_waitable_timer*;
_分配器=std::分配器]'
/usr/include/c++/4.8/bits/vector.tcc:415:43:从“void”开始需要
std::vector::_M_emplace_back_aux(_Args&&…[带_Args
={boost::asio::io\u服务&};\u Tp=boost::asio::basic\u waitable\u计时器
_Alloc=std::分配器]'
/usr/include/c++/4.8/bits/vector.tcc:101:54:从“void”开始需要
std::vector::将_-back(_-Args&&…)与_-Args一起放置=
{boost::asio::io_服务&};\u Tp=
boost::asio::基本可等待计时器
_Alloc=std::分配器]'
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&&)'
{::新建(静态_-cast(u-p))_-T1(标准::转发(u-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&&)'
由于默认定义为
格式不正确:
类基本\可等待\计时器
^
在文件中包括从
/usr/local/include/boost/asio/basic_socket.hpp:20:0,
从/usr/local/include/boost/asio/basic\u datagram\u socket.hpp:20,
从/usr/local/include/boost/asio.hpp:21,
来自main.cpp:3:
/usr/local/include/boost/asio/basic_io_对象。hpp:163:3:错误:
'boost::asio::basic_io_对象::basic_io_对象(const
boost::asio::basic_io_对象&)[with
IoObjectService=
boost::asio::可等待的\u计时器\u服务bool
Movable=false]“是私有的
基本对象(常量基本对象&);
^
在/usr/local/include/boost/asio.hpp:33:0中包含的文件中,
来自main.cpp:3:
/usr/local/include/boost/asio/basic_waitable_timer.hpp:127:7:错误:
在此背景下
类基本\可等待\计时器
^

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

  • 使用
    唯一\u ptr
  • 使用不要求元素在所有操作中都可移动的容器,如
    deque
    list
看起来是这样的:

#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
}
#包括
#包括
#包括
#包括
int main(){
boost::asio::io_服务io;
boost::asio::system_timer t{io};//工作正常
std::deque定时器;
timers.emplace_back(io);//应该可以工作
timers.push_back(std::move(t));//不起作用
}

但是不要尝试对集合使用
insert
erase
,因为它们需要可移动性。

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

  • 使用
    唯一\u ptr
  • 使用不要求元素在所有操作中都可移动的容器,如
    deque
    list
看起来是这样的:

#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
}
#包括
#包括
#包括
#包括
int main(){
boost::asio::io_服务io;
boost::asio::system_timer t{io};//工作正常
std::deque定时器;
timers.emplace_back(io);//应该可以工作
timers.push_back(std::move(t));//不起作用
}
但不要尝试对集合使用
insert
erase
,因为它们需要可移动性