2012-12-05 10 views
8

Nehmen Sie das folgende Bit Code, der boost :: asio verwendet.Seltsame C4512 Warnung. Warum?

#include <boost/asio.hpp> 

using boost::asio::ip::tcp; 

class SocketTest 
{ 

private:    

    boost::asio::io_service& mIOService; 
    tcp::acceptor mAcceptor; // Comment this line 

public: 

    SocketTest(boost::asio::io_service& io_service) 
     : mIOService(io_service) 
     , mAcceptor(io_service, tcp::endpoint(tcp::v4(), 8080)) // Comment this line 
    {  
    } 
}; 

Wenn Sie die beiden markierten Linien der Compiler (Visual Studio 2010) Kommentar gibt die folgende Warnung heraus beim Kompilieren auf/W4.

warning C4512: 'SocketTest' : assignment operator could not be generated 

Was macht diese beiden Linien so besonders? Warum erlaubt ihre Existenz die Generierung des Zuweisungsoperators?

Antwort

7

Der Grund für dieses Verhalten ist, dass tcp::acceptor nicht kopierbar ist (er erbt von basic_io_object, dessen Kopiezuweisungsoperator privat ist, so dass sein eigener Kopierzuweisungsoperator nicht implizit deklariert wird). Wenn ein nicht kopierbares Element verwendet wird, wird die Generierung des implizit deklarierten Kopierzuweisungsoperators vermieden, es wird jedoch keine Warnung ausgegeben, da dies als erwartetes Verhalten angesehen wird.

Auf der anderen Seite, wenn Sie diese zwei Zeilen auskommentieren, ist Ihre Klasse nur mit einem Referenzelement; Dies macht Ihre Klasse auch nicht kopierbar, löst aber laut Visual Studio-Dokumentation eine Warnung aus. Ich stimme zu, dass dies auch erwartet wird, aber die Compiler-Implementierer beschlossen, Ihnen eine Warnung zu geben, nur für den Fall. Der Grund kann sein, dass eine explizit nicht kopierbare Klasse (wie es bei der Fall ist) eine explizite Designentscheidung ist, aber ich rate nur hier.

+0

Ah, ja. Du scheinst richtig zu sein. Vererben von boost :: noncopyable löste die Warnung. Es erklärt auch, warum mein Versuch, das Problem mit einem atomaren Typ (int & und int) neu zu erstellen, das Problem nicht neu erstellt. Danke vielmals. – UberMongoose

+0

Update von der Zukunft: in C++ 11 gibt es einen besseren Weg, dies zu handhaben: http://stackoverflow.com/questions/9458741/with-explicitly-deleted-member-functions-in-c11-is-it-still -Worthwhile-to-inh – Tim

Verwandte Themen