我想這是良好的,我還沒有找到一個直接聲明(措辭有時清晰度/插圖某些情況下沒有),但我想這可以推斷:
§5.1.2/ 23 :
A捕獲隨後省略號是一包擴展(14.5.3)。 [實施例:
template<class... Args>
void f(Args... args) {
auto lm = [&, args...] { return g(args...); };
lm();
}
- 端示例]
- A捕獲後跟省略,意味着
args
,在λ-捕獲,是一個例子一個捕獲(在這種情況下,明確的),並且值得注意的事實是args
是一個參數包標識符。這個短小段落描述lambda-captures如何保持包擴展,這表明參數包可以被捕獲,即使其目的不是約允許他們被捕獲。
§5.1.2/ 12:
的實體被捕獲如果它被捕獲明確或隱含 [...]
§3/ 3:
一種實體是值,對象,參考,功能,枚舉,類型,類的成員,模板,模板特,命名空間,參數包,或這。
從這我假設參數包是可以明確或隱含被捕獲,因此,同樣的拍攝規則對於普通的變量應適用,但參數包應相應擴大實體。
我想你的問題(和相同的論證)同樣適用於例如參考變量(It is unspecified whether or not a reference requires storage. §8.3.2/4)。當你允許或不參考參數包標識符時,你似乎對你感興趣。
您可以認爲外部作用域中的引用變量相同,因爲您可能有權訪問它們,但甚至不能訪問原始變量的標識符。
它們與參數包相同。
我知道你可以明確地捕獲它們,但是我還沒有看到任何「無論你明確捕獲,你都可以隱式捕獲,反之亦然」的效果。 – chris
如果它形成良好,我相信它會導致無限遞歸。 :-)我不確定這個標準是怎麼說的。我認爲這是未定義的行爲。 ;-)如果是這樣,那就意味着解析該代碼可以得到任何結果,即使lambda中的包裝表達式格式良好。 :-) – Omnifarious
謝謝omnifarious - 我修復了無限遞歸問題。 –