移动语义IO对象
当移动语义是可用的特性(通过右值引用),Asio允许移动构造和对socket,连续的端口,POSIX描述符,Windows句柄进行assign操作。
移动语义会让你写出以下风格的代码:
tcp::socket make_socket(io_service& i)
{
tcp::socket s(i);
...
std::move(s);
}
或者:
class connection: public enable_shared_from_this<connection>
{
private:
tcp::socket socket_;
...
public:
connection(tcp::socket&& s): socket_(std::move(s)) {}
...
};
...
class server
{
private:
tcp::acceptor acceptor_;
tcp::socket socket_;
...
void handle_accept(error_code ec)
{
if (!ec)
std::make_shared<connection>(std::move(socket_))->go();
acceptor_.async_accept(socket_, ...);
}
...
};
同样的:
std::vector<tcp::socket> sockets;
sockets.push_back(tcp::socket(...));
这里有一个忠告:虽然没有任何的程序阻止你在异步等待时进行移动操作,但是这样做可能会出问题。特别是像async_read()这样的函数,它内部保存了一份流对象的引用,如果你此时进行移动操作,那么那个引用很有可能指向移动前的对象。
只要你使用-std=c++0x或者-std=gnu++0x,移动语义在g++ 4.5及其以上的版本上自动支持。你可以用 ASIO_DISABLE_MOVE来禁用移动语义,也可以使用 ASIO_HAS_MOVE来启用移动语义。注意上面两个宏同时也会影响movable handlers。