2012-12-05 12 views
8

Prendere il seguente bit di codice che utilizza boost :: asio.Avviso strano C4512. Perché?

#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 
    {  
    } 
}; 

Se si commento le due linee contrassegnate il compilatore (Visual Studio 2010) dà il seguente avviso quando si compila on/W4.

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

Che cosa rende queste due linee così speciali? Perché la loro esistenza consente la generazione dell'operatore incaricato?

risposta

7

Il motivo di questo comportamento è che tcp::acceptor non è copiabile (eredita da basic_io_object, il cui operatore di assegnazione copie è privato, quindi il proprio operatore di assegnazione copia non viene dichiarato implicitamente). Avere un membro non copiabile evita la generazione dell'operatore di assegnazione di copia implicitamente dichiarato, ma non genera un avviso perché questo è considerato il comportamento previsto.

D'altra parte, se si commentano queste due righe, la classe viene lasciata solo con un membro di riferimento; questo rende anche la tua classe non copiabile, ma solleva un avvertimento in base alla documentazione di Visual Studio. Sono d'accordo che questo è anche previsto, ma gli implementatori del compilatore hanno deciso di darti un avvertimento per ogni evenienza. La ragione potrebbe essere che rendere esplicitamente non copiabile una classe (come nel caso di basic_io_object) è una decisione esplicita di progettazione, ma qui sto solo indovinando.

+0

Ah, sì. Sembri corretto. Ereditare da boost :: noncopyable risolto l'avviso. Spiega anche perché il mio tentativo di ricreare il problema con un tipo atomico (int & e int) non ricrea il problema. Grazie molto. – UberMongoose

+0

Aggiornamento dal futuro: in C++ 11 c'è un modo migliore per gestire questo: http://stackoverflow.com/questions/9458741/with-explicitly-deleted-member-functions-in-c11-is-it-still -worthwhile-to-inh – Tim

Problemi correlati