Strange C4512 Warnung. Warum?

8

Nehmen Sie das folgende Code-Bit, das boost :: asio verwendet.

%Vor%

Wenn Sie die markierten Zeilen kommentieren, gibt der Compiler (Visual Studio 2010) beim Kompilieren von / W4 die folgende Warnung aus.

%Vor%

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

    
UberMongoose 05.12.2012, 08:59
quelle

1 Antwort

7

Der Grund für dieses Verhalten ist, dass tcp::acceptor nicht kopierbar ist (er erbt von basic_io_object , dessen Kopierzuweisungsoperator 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.

Wenn Sie andererseits diese beiden Zeilen auskommentieren, bleibt Ihre Klasse nur mit einem Referenzmitglied; 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 das bei basic_io_object der Fall ist) eine explizite Designentscheidung ist, aber ich rate nur hier.

    
Gorpik 05.12.2012, 09:23
quelle

Tags und Links