[英]ADL fails when there are lambda arguments?
很久以前我注意到在Visual C ++ 10中,當至少有一個參數是lambda時ADL失敗了。
std::vector<float> vec;
for_each(begin(vec), end(vec), [](float) {});
以上無法在VC ++ 10和11(beta)上編譯(通過ADL找到開始和結束)。 當我將lambda函數轉換為常規自由函數時,事情就像預期的那樣工作。
我曾經在Herb Sutters博客上問了一次,並且還閱讀了msdn connect上的一些帖子,通常的答案是:這是一個錯誤,我們還沒有實現lambdas的最新標准,但當時 - 這是很容易理解的。 事情尚未成熟。 在MS連接上也有令人不安的評論,即下一版本即vc 11將無法解決這個問題。
我的問題是,此代碼預計 C ++ 11標准下工作? 我無法理解這一點。 當我使用lambdas時,我是否真的必須使用std ::為我的for_each和其他算法添加前綴? 我不知何故懷疑在vc ++ 11發布后這種行為不會改變。
該標准不保證您想要它...
考慮到以下因素,我們可以很容易地發現,沒有什么能保證ADL在類似於帖子中提供的示例的情況下工作。
std::begin (c)
/ std::end (c)
這些功能在標准中描述如下:
template <class C> auto begin(C& c) -> decltype(c.begin()); template <class C> auto end(C& c) -> decltype(c.end());
雖然Container< ... >::iterator
(它是c.begin ()
的返回類型)是一個實現定義的類型。
有關此問題的更多信息,請參閱24.5.6 Range Access和23.3.6.1/2類模板向量 (或任何其他模板STL容器)。
[](){}
- Lambda表達式
lambda是一個實現定義的類型,標准中沒有任何內容表明生成的對象將是名稱空間std下的類型。
只要它符合標准設定的其他規則,它幾乎可以存在於任何需要的地方。
太長; 沒看過
std::begin
/ std::end
/ a lambda-expression
產生的類型不能保證在命名空間std下 ,因此不保證ADL會啟動。
這是完全有效的代碼。 任何無錯誤的編譯器都可以編譯它。 但是由於MSVC有bug而且無法通過ADL搜索函數,那么也許你不應該依賴ADL而是用std::
限定它來幫助編譯器找到函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.