2016-10-06 132 views
0

我正在依賴lambdas的現有代碼的重構中。在新版本的代碼中,我希望將調用推遲到lambda表達式中,所以我想阻止任何未來的用戶意外地通過引用捕獲,以及使用編譯器查找所有違規的現有代碼。有沒有辦法通過引用來阻止lambda捕獲

這是可能的與c + + 11?

+1

沒有。任何人都可以自由編寫一個通過引用捕獲的lambda。 –

+0

你爲什麼要阻止?通過引用捕獲可能非常有用? – Rerito

+0

@Rerito:主要原因是您將要存儲該lambda並稍後調用它,此時引用可能已失效。所以你想避免任何人傳遞你這樣的lambda。然後再次,這可能是一個XY問題。 Lambda不是唯一的函數類型,真正的問題是決定哪些函數可以存儲。 – MSalters

回答

1

號,它不會太大幫助:一旦壽命超過目前的範圍,你必須都捕獲價值確保所有指針的壽命或提及的(任何方式)的資源進行管理。

異步回調與同步回調完全不同,而C++類型的系統在這裏無法實現安全。

即使解決了資源生命期問題,調用代碼也期望lambda立即發生更改,現在它們不會。每種用法都必須針對新模式進行審覈。

0

使用編譯器查找所有違規的現有代碼。

這是可能的,但使用libtooling /鐺插件不平凡 - 但可能不是你如何期望。

您可以在編譯所有代碼後編寫一個編譯器運行的插件,並且該插件可以在編譯代碼時檢查clang構建的AST。您可以遍歷AST來查找lambdas並檢查其捕獲列表的類型。這很酷,但文檔不是很好,可能是一個耗時的過程。一次性項目可能不值得。

+0

我認爲clang的插件集成是通過libtooling(使用其內部C++ API IIRC)進行的。 libclang是一個非常穩定的C API,可以讓你在獨立程序中玩弄AST。這肯定可以用libclang來實現,但作爲外部檢查工具 – Rerito

+0

http://clang.llvm.org/docs/Tooling.html - 當你想完全控制Clang AST時,不要使用LibClang。當你想完全控制Clang AST時使用LibTooling/ClangPlugin。我會在我的答案中更新措辭,因爲我不是指libclang。 – xaxxon

+0

而且文件確實不是很好。太糟糕了,因爲它是一個非常強大的工具:( – Rerito

相關問題