2012-10-05 35 views
8

我需要從綁定成員函數創建一個謂詞,所以我將它包裝在一個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_typeSomeObject const &,並通過實例化的std::unary_negate<_Fn1>std::not1內部試圖使用const typename _Fn1::argument_type&並且編譯器拒絕它,因爲T::argument_type已經是參考。我確信這應該在C++ 11下編譯,但這是舊版編譯器,它只是C++ 03。所以,我想知道是誰的錯,它是:

  • 編譯器的,因爲它要崩潰參考(apparently not)
  • 標準庫的,因爲它必須準備處理仿函數取引用(顯然不是,因爲規範定義unary_negateconst typename Predicate::argument_type& x參數),
  • 升壓轉換器的,因爲argument_type不應該參考即使實際的說法是或
  • 我的,因爲boost::function不應當參考參數一起使用?
+0

是否在其他編譯器下編譯? – eh9

+0

@ eh9:使用gcc編譯,至少對於mingw32和cygwin目標。 –

+0

@ eh9:但這個問題不太相關,誰是過錯,爲什麼取決於規範。 –

回答

1

故障當然不是Boost的; boost::function基本上只是std::function,具有所有相同的語義。並且參考參數boost::function也正常工作。你只能用std::not1或其他的<functional>東西。

C++ 11的引用崩潰使得std::not1以您認爲應該的方式工作。在C++ 03中指定的方式std::not1在沒有引用崩潰的情況下不可能工作 - 除了在實現中實現者做了一點創造性解釋而不是隨便地遵循標準的字母。

這是可能加入的std::unary_negate一個專門爲參照argument_type小號謂詞來使C++ 03 std::not1工作,但既不的libC++也不++的libstdc已經這樣做了。

但是你知道誰有? 提升!如果您只是將您的代碼更改爲在當前使用的任何地方使用boost::not1std::not1,everything will work fine.基本上,請考慮boost命名空間,就好像它是一個符合C++ 11的版本std;任何在C++ 11的std命名空間中工作的東西都可能在C++ 03的boost命名空間中起作用。


警告,希望題外話:我的MacBook(Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn))鐺編譯器默默崩潰甚至在-std=c++03模式的引用,使

typedef const int& ref; 
typedef const ref& ref2; 

不會產生錯誤。當您測試C++ 03代碼時,請確保您沒有使用具有此錯誤特性的編譯器。