我需要从绑定的成员函数创建一个谓词,所以我将它包装在一个boost::function<bool(SomeObject const &)>
. 这似乎很好,一切都很好,但我也需要在一种情况下否定它。然而
boost::function<bool(SomeObject const &)> pred;
std::not1(pred);
无法在 MSVC++ 9.0 (Visual Studio 2008) 下编译,抱怨对引用的引用无效:
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
问题是boost::function
定义argument_type
asSomeObject const &
和内部std::unary_negate<_Fn1>
实例化的 bystd::not1
尝试使用const typename _Fn1::argument_type&
并且编译器拒绝它,因为T::argument_type
它已经是一个引用。我确信它应该在 C++11 下编译,但这是旧的编译器,只有 C++03。所以我想知道是谁的错:
- 编译器的,因为它应该折叠引用(显然不是),
- 标准库的,因为它应该准备好处理获取引用的函子(显然不是,因为规范定义
unary_negate
了const typename Predicate::argument_type& x
参数), - boost's,因为
argument_type
即使实际参数是 or 也不应该被引用 - 我的,因为
boost::function
不应该与参考参数一起使用?