簡體   English   中英

有lambda參數時,ADL會失敗嗎?

[英]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 Access23.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM