Warum werden die Kopier- und Zuweisungskonstruktoren in request_handler in the ASIO http server example gelöscht? Hier ist der Header die Lookup zu speichern:Gelöschte Kopier- und Zuweisungskonstruktoren in request_handler des HTTP-Serverbeispiels
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);
};
Wenn überhaupt, scheint, dass das einzige Feld doc_root_
können Konstrukteure const und Standard gemacht werden würde, wenn nötig? Der Code kopiert den Handler im veröffentlichten Beispiel nicht wirklich. Allerdings erkunde ich die Möglichkeit in meinem Code und es wäre toll zu verstehen, wenn mir etwas sehr Grundlegendes fehlt.
Vermisse ich, wo ein 'request_handler' kopiert werden könnte? Der "connection" -Konstruktor nimmt es als Referenz: https://github.com/boostorg/asio/blob/boost-1.62.0/example/cpp11/http/server/connection.cpp#L21. Wenn es irgendwo kopiert würde, würde der aktuelle Code mit dem explizit gelöschten Kopierkonstruktor nicht funktionieren. Ich kann verstehen, wenn die Löschung ein Schutz gegen einen versehentlichen zukünftigen Kopiercode ist, aber das ist alles was ich mir vorstellen kann. Noch etwas? –
Ja, in dem einmal erstellten Code 'request_handler' wird immer als Referenz gespeichert. Wenn es überhaupt versehentlich kopiert wurde, würde der Compiler weinen und fehlschlagen, weil die Kopier- und Zuordnungsfunktionen als gelöscht markiert sind. Ja, Löschen ist ein Schutzmechanismus, um dem Leser (und Compiler) zu sagen, dass das Objekt nicht kopiert werden kann und was ich beantwortet habe, ist einer der Gründe dafür. Es gibt andere Gründe, dasselbe zu tun, aber das passt am besten mit dem fraglichen Code. – Arunmu