Necesito crear un predicado a partir de la función de miembro enlazado, así que lo envolví en un boost::function<bool(SomeObject const &)>
. Eso parece estar bien y todo, pero también necesitaba negarlo en un caso. Sin embargoColapso de referencia bajo C++ 03
boost::function<bool(SomeObject const &)> pred;
std::not1(pred);
no compila bajo MSVC++ 9.0 (Visual Studio 2008), quejándose de que consultará la referencia no es válida:
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
El problema es que boost::function
define el argument_type
como SomeObject const &
y la std::unary_negate<_Fn1>
instancia por std::not1
internamente trata de usar const typename _Fn1::argument_type&
y el compilador lo rechaza porque T::argument_type
ya es una referencia. Estoy seguro de que eso debería compilarse bajo C++ 11, pero este es un viejo compilador que solo es C++ 03. Así que me gustaría saber quién es la culpa que es:
- del compilador, ya que debe derrumbarse la referencia (apparently not),
- de la biblioteca estándar, ya que debe estar preparado para manejar funtores que toman referencias (al parecer no es así, debido a que la especificación define
unary_negate
conconst typename Predicate::argument_type& x
argumento), - impulso de, porque no debería ser
argument_type
referencia incluso cuando el argumento actual es o - mío, porque
boost::function
no debe utilizarse con argumentos de referencia?
¿Se compila bajo otros compiladores? – eh9
@ eh9: con gcc compila, al menos para objetivos mingw32 y cygwin. –
@ eh9: Pero no es demasiado relevante para la pregunta; quién es el culpable y por qué depende de la especificación. –