explicit
macht Sinn, mit mehreren Parametern im Zusammenhang mit den Klammer-Initialisierungen in C++ 11 und höher:
void foo(Chart const &);
// ...
// Will only compile without `explicit`
foo({Chart::Type::pie, myObj});
Ob binärkompatibel ist letztlich zu entfernen explicit
auf Ihrem Compiler ab, so dass Sie‘ Ich muss das in seiner Dokumentation finden.
Da explicit
jedoch eine High-Level-Sprachfunktion ist, die nur die Übersteuerungsauflösung steuert, würde ich nicht erwarten, dass sie die Kompatibilität unterbricht, solange sie nicht die beste Übereinstimmung für einen bereits bestehenden Anruf ändert , einschließlich in jedem Code, den Sie aus der Bibliothek selbst kompilieren (Vorlagen und/oder Inline-Funktionen).
Das heißt, das ist reine Ad-hoc-Patching: nach dem Standard, so dass Sie direkt in UB Gebiet schleudert. Zitat von n.m.:
Fummeln mit Kopfzeilen wie das bricht ODR. Die Binärdateien des Herstellers werden mit einer bestimmten Definition einer Klasse kompiliert, Ihre Binärdateien werden mit einer anderen Definition derselben Klasse kompiliert. Das ist illegal. Es spielt keine Rolle, wie klein die Änderung ist. Die Definitionen müssen Token für Token identisch sein, Periode.
ich einfach empfehlen würde, um die Warnung in diesem Header zu Schweigen, indem man sich in #pragma
s Einwickeln wo enthalten (oder in einem Header benutzerdefinierten Proxy und umfasst das).
Deaktivieren Sie dumme Warnungen. –
Ich denke, das ist der beste Ratschlag :-) – dhaumann
Die Warnung verwendet, um vor-C++ 11 perfekten Sinn zu machen. Wenn Ihr Compiler vor C++ 11 ist, können Sie auf ernstere Probleme mit C++ 11-Code stoßen, daher sollten Sie ein Upgrade in Betracht ziehen. –