2016-11-09 7 views
0

Почему конструкторы копирования и присваивания удалены в request_handler in the ASIO http server example? Вот заголовок, чтобы сохранить поиск:Удаленные копии и конструкторы присваивания в request_handler примера http-сервера

class request_handler 
{ 
public: 
    request_handler(const request_handler&) = delete; 
    request_handler& operator=(const request_handler&) = delete; 

    /// Construct with a directory containing files to be served. 
    explicit request_handler(const std::string& doc_root); 

    /// Handle a request and produce a reply. 
    void handle_request(const request& req, reply& rep); 

private: 
    /// The directory containing the files to be served. 
    std::string doc_root_; 

    /// Perform URL-decoding on a string. Returns false if the encoding was 
    /// invalid. 
    static bool url_decode(const std::string& in, std::string& out); 
}; 

Если что-то, кажется, что единственное поле doc_root_ можно константные и конструкторы по умолчанию будет делать, если это необходимо? Код фактически не копирует обработчик в опубликованном примере. Тем не менее, я изучаю возможность в своем коде, и было бы прекрасно понять, не хватает ли я чего-то очень элементарного.

ответ

1

Это имеет смысл, поскольку копирование doc_root_ может привести к дополнительному распределению памяти. Это означает, что для каждого нового connection он будет скопировать request_handler на соединение, тем самым делая выделение памяти (если SSO не применимо к размеру string).

Если я могу избежать ненужных ассигнований, я бы определенно сделал это, более того, в случае, если request_handler не хранит никаких данных по connection конкретных данных.

ПРИМЕЧАНИЕ. Я готов переместить это как комментарий, если он не полностью отвечает на вопрос.

+0

Пропустить ли я, когда можно было бы скопировать 'request_handler'? Конструктор 'connection' принимает его по ссылке: https://github.com/boostorg/asio/blob/boost-1.62.0/example/cpp11/http/server/connection.cpp#L21. Если он будет скопирован в любом месте, текущий код с явно удаленным конструктором копии не будет работать. Я могу понять, является ли удаление защитой от случайного будущего кода копирования, но это все, о чем я могу думать. Что-нибудь еще? –

+1

Да, в коде 'request_handler', когда-то построенном, всегда хранится как ссылка. Если это вообще было случайно скопировано, компилятор будет плакать и терпеть неудачу, потому что функции копирования и назначения помечены как удаленные. Да, удаление является защитным механизмом, чтобы сообщить читателю (и компилятору), что объект не может быть скопирован, и то, на что я ответил, является одной из причин его совершения. Есть и другие причины для этого, но это лучше всего подходит для данного кода. – Arunmu