簡體   English   中英

強制C ++ 11 lambda捕獲變量

[英]Forcing C++11 lambda to capture a variable

假設復制變量具有所需的副作用。 我想聲明一個復制變量但不使用該變量的lambda。 這樣做的最低要求是什么?

Copiable copyable;

auto lambda1 = [=](){};
auto lambda2 = [copyable](){};
auto lambda3 = [=](){ copyable; }
auto lambda4 = [=](){ volatile copy = copyable; }

lambda1使用隱式捕獲,並且由於正文沒有提到可copyable ,我不相信它實際上是復制它。

lambda2使用顯式捕獲,看起來根據 ,它應該通過復制捕獲。 是否允許編譯器刪除副本? 有關此問題的另一個討論,請參閱

lambda3使用隱式捕獲但身體提到可copyable 這是否構成了可copyable 的使用方法?

lambda4使用隱式捕獲並強制另一個volatile副本。 我確信這實際上會有效,但它的副本數量超過了最低限度。

激勵案例:我需要在完成任意數量的lambda調用后運行清理,可能在不同的線程中。 我可以通過使用std::shared_ptr和一個運行清理的自定義刪除器來實現這一點,並以某種方式將其傳遞給每個lambda。 然后,當所有共享ptrs超出范圍時,清理將運行。

編輯: lambda3lambda4缺少=隱式捕獲。

這樣做的最低要求是什么?

按值顯式捕獲,如lambda2

lambda1使用隱式捕獲,並且由於正文沒有提到可復制,我不相信它實際上是復制它。

那就對了。 只有在lambda中使用變量時,才會隱式捕獲變量。

lambda2使用顯式捕獲,看起來根據 ,它應該通過復制捕獲。

那就對了。 無論是否使用,都將捕獲任何明確捕獲的變量。 這是您要確保捕獲對象的目的。

是否允許編譯器刪除副本? 有關此問題的另一個討論,請參閱

不。如果捕獲了變量,則捕獲它。 這個鏈接並沒有真正“討論”那個; 唯一的答案證實了這種情況,標准中有適當的措辭。

lambda3使用隱式捕獲但身體提到可復制。 這是否構成了可復制的使用方法?

是。 odr-use的定義是

名稱顯示為潛在評估表達式的變量是odr-used,除非它是滿足出現在常量表達式中的要求的對象,並且立即應用左值到右值轉換。

並且異常不適用,因為它不是常量(因此不能出現在常量表達式中)。 (但請注意,由於沒有默認捕獲,因此格式不正確。)

lambda4使用隱式捕獲並強制另一個volatile副本。 我確信這實際上會有效,但它的副本數量超過了最低限度。

確實; 你通過使用值強制隱式捕獲,並強制額外的副本。 這是不必要的,因為lambda2做你想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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