移动语义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。

results matching ""

    No results matching ""