Ich muss ein Prädikat aus gebundener Elementfunktion erstellen, also habe ich es in eine boost::function<bool(SomeObject const &)>
eingewickelt. Das scheint in Ordnung zu sein und alles, aber ich musste es auch in einem Fall negieren. JedochReferenzkollaps unter C++ 03
boost::function<bool(SomeObject const &)> pred;
std::not1(pred);
nicht unter MSVC++ kompiliert 9.0 (Visual Studio 2008), dass der Bezug zu beschweren Referenz ist ungültig:
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\functional(213) : warning C4181: qualifier applied to reference type; ignored
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\functional(213) : error C2529: '_Left' : reference to reference is illegal
Das Problem ist, dass boost::function
die argument_type
als SomeObject const &
definiert und die std::unary_negate<_Fn1>
instanziiert durch std::not1
intern versucht, const typename _Fn1::argument_type&
zu verwenden, und Compiler weist es zurück, weil T::argument_type
bereits eine Referenz ist. Ich bin mir sicher, dass das unter C++ 11 kompiliert werden sollte, aber das ist ein alter Compiler, der nur C++ 03 ist. So würde Ich mag wissen, wer schuld ist:
- die Compiler, weil sie den Verweis kollabieren sollte (apparently not),
- die Standard-Bibliothek, weil sie bereit sein sollte, functors unter Referenzen zu handhaben (anscheinend nicht, weil die Spezifikation definiert mit
const typename Predicate::argument_type& x
Argumenteunary_negate
), - Auftrieb des, weil
argument_type
nicht Bezug auch sein soll, wenn das tatsächliche Argument ist oder - Mine, weil
boost::function
sollte nicht mit Bezug Argumenten verwendet werden?
Kompiliert es unter anderen Compilern? – eh9
@ eh9: Mit gcc kompiliert es, zumindest für mingw32 und cygwin Ziele. –
@ eh9: Aber es ist nicht relevant für die Frage; Wer ist schuld, es ist und warum hängt von der Spezifikation ab. –