簡體   English   中英

g++ 不允許在 lambda 中通過引用廣義捕獲 const 對象?

[英]g++ won't allow generalized capture of const object by reference in lambda?

這被 g++(4.9.3 和 5.2.0)拒絕,但被 clang 3.5.0 接受:

int main() { 
    const int ci = 0;
    auto lambda = [ &cap = ci ]() { };
}

g++ 給出error: binding 'const int' to reference of type 'int&' discards qualifiers 似乎 g++ 拒絕允許捕獲非常量引用,當然使用普通的舊 C++11 捕獲[&ci]除外。 這似乎是一個非常奇怪的約束,也許是 g++ 中的一個錯誤?

您的代碼有效。 §5.1.2/11 去

一個init-capture 的行為就像它聲明並顯式地捕獲了以下形式的變量
auto初始化捕獲; ”,其聲明區域是lambda 表達式復合語句[…]

現在,明確地宣布

auto &cap = ci;

和捕獲cap很好。 那是,

int main() { 
    const int ci = 0;
    auto &cap = ci;
    auto lambda = [&cap]() { };
}

用 GCC 編譯 除了cap的聲明區域和生命周期外,此代碼段與您的代碼段沒有區別,因此 GCC 是不正確的。
這個錯誤已經被報告為#66735 ,有一個類似的例子:

int x = 0;
auto l = [&rx = static_cast<const int&>(x)] {};

這看起來類似於gcc 錯誤:[C++14] lambda init-capture failed for const 引用,它說:

此代碼無法編譯:

 int main() { int x = 0; auto l = [&rx = static_cast<const int&>(x)]() {}; }

錯誤信息是:

test.cpp:3:14: 錯誤:將“const int”綁定到“int&”類型的引用會丟棄限定符

auto l = [&rx = static_cast<const int&>(x)]() {

但是根據 [expr.prim.lambda]/11 rx 應該被捕獲為 auto &rx = static_cast(x),也就是 const int&。

錯誤報告引用[expr.prim.lambda]/11說:

init-capture 的行為就像它聲明並顯式捕獲“auto init-capture;”形式的變量一樣。 其聲明區域是 lambda 表達式的復合語句,除了 [...]

暫無
暫無

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

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