我需要從綁定成員函數創建一個謂詞,所以我將它包裝在一個boost::function<bool(SomeObject const &)>
中。這似乎是很好的一切,但我也需要在一種情況下否定它。然而在C++中引用崩潰03
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
爲SomeObject const &
,並通過實例化的std::unary_negate<_Fn1>
std::not1
內部試圖使用const typename _Fn1::argument_type&
並且編譯器拒絕它,因爲T::argument_type
已經是參考。我確信這應該在C++ 11下編譯,但這是舊版編譯器,它只是C++ 03。所以,我想知道是誰的錯,它是:
- 編譯器的,因爲它要崩潰參考(apparently not),
- 標準庫的,因爲它必須準備處理仿函數取引用(顯然不是,因爲規範定義
unary_negate
與const typename Predicate::argument_type& x
參數), - 升壓轉換器的,因爲
argument_type
不應該參考即使實際的說法是或 - 我的,因爲
boost::function
不應當參考參數一起使用?
是否在其他編譯器下編譯? – eh9
@ eh9:使用gcc編譯,至少對於mingw32和cygwin目標。 –
@ eh9:但這個問題不太相關,誰是過錯,爲什麼取決於規範。 –