Potrzebuję utworzyć predykat z funkcji ograniczonego elementu, więc zapakowałem go w boost::function<bool(SomeObject const &)>
. Wydaje się, że wszystko jest w porządku i wszystko, ale w jednym przypadku musiałem je zanegować. JednakZawijanie referencji pod C++ 03
boost::function<bool(SomeObject const &)> pred;
std::not1(pred);
nie skompilować pod MSVC++ 9.0 (Visual Studio 2008), twierdząc, że odniesienie do odniesienia jest nieprawidłowy:
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
Problemem jest to, że boost::function
definiuje argument_type
jak SomeObject const &
i std::unary_negate<_Fn1>
wystąpienia przez std::not1
wewnętrznie próbuje użyć const typename _Fn1::argument_type&
, a kompilator odrzuca go, ponieważ T::argument_type
jest już odnośnikiem. Jestem pewien, że to powinno się skompilować pod C++ 11, ale jest to stary kompilator, który jest tylko C++ 03. Więc chciałbym wiedzieć, kto to wina:
- kompilator, ponieważ powinna ona zapaść odniesienie (apparently not),
- biblioteka standardowa, ponieważ powinien on być przygotowany do nie obsługiwać funktory biorąc referencje (podobno, ponieważ specyfikacja definiuje
unary_negate
zconst typename Predicate::argument_type& x
argument), - doładowania, bo
argument_type
nie powinno być odniesienie nawet gdy rzeczywisty argument jest lub - kopalni, bo
boost::function
nie powinien być stosowany z argumentów referencyjnych?
Czy jest kompilowany pod innymi kompilatorami? – eh9
@ eh9: Z gcc kompiluje, przynajmniej dla celów mingw32 i cygwin. –
@ eh9: Ale to nie jest zbyt istotne dla pytania; kto jest winien i dlaczego zależy od specyfikacji. –