Ho bisogno di creare un predicato dalla funzione membro associato, quindi l'ho spostato in un boost::function<bool(SomeObject const &)>
. Sembra che stia bene e tutto, ma ho anche avuto bisogno di negarlo in un caso. TuttaviaRiferimento collasso sotto C++ 03
boost::function<bool(SomeObject const &)> pred;
std::not1(pred);
non compila sotto MSVC++ 9.0 (Visual Studio 2008), lamentando che il riferimento per fare riferimento non è valido:
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
Il problema è che boost::function
definisce il argument_type
come SomeObject const &
e la std::unary_negate<_Fn1>
istanziato da std::not1
tenta internamente di utilizzare const typename _Fn1::argument_type&
e il compilatore lo rifiuta perché T::argument_type
è già un riferimento. Sono certo che questo dovrebbe essere compilato in C++ 11, ma questo è un vecchio compilatore che è solo C++ 03. Così mi piacerebbe sapere chi è la colpa è:
- del compilatore, perché dovrebbe crollare il riferimento (apparently not),
- della libreria standard, perché dovrebbe essere preparato a gestire funtori che prendono i riferimenti (a quanto pare non, perché la specifica definisce
unary_negate
conconst typename Predicate::argument_type& x
argomento), - Boost, perché
argument_type
non dovrebbe essere di riferimento anche quando l'argomento reale è o - mia, perché
boost::function
non deve essere utilizzato con argomenti di riferimento?
Compila sotto altri compilatori? – eh9
@ eh9: Con gcc compila, almeno per gli obiettivi mingw32 e cygwin. –
@ eh9: Ma non è troppo rilevante per la domanda; chi è la colpa è e perché dipende dalle specifiche. –