为什么捕获列表中的 [[maybe_unused]] 不可能?

Seb*_*anH 8 c++ c++17

我想知道为什么我不能在 lambda 的捕获列表中使用 [[maybe_unused]] 属性。是否有原因导致捕获列表的变量无法标记为 [[maybe_unused]]?这将避免捕获所有变量,即 [&],在这种情况下:

auto lambda = [&x, [[maybe_unused]] &y](){ 
    if constexpr( x >= 0) {
        return x;
    }
    else {
        return y;
    }
}
Run Code Online (Sandbox Code Playgroud)

在 x >= 0 的每种情况下,编译器都会警告未使用 y。但如果 x < 0,则不会发出警告。我的第一次尝试是使用 [[maybe_unused]],但这是不可能的。

我的问题:是否有原因,为什么我不能在 lambda 捕获列表中使用 [[maybe_unused]] 属性?

mrk*_*rks 3

我在邮件列表上也问了同样的问题。亚瑟·奥德怀尔 (Arthur O'Dwyer) 的回答是:

啊,是的,这可能是 [[maybe_unused]] 可能适用的地方。但是,现在您可以轻松地编写

(void)a;
Run Code Online (Sandbox Code Playgroud)

抑制警告:https://godbolt.org/z/7ZHSYz这不会让代码变得混乱(因此更容易阅读和维护),并且也可以在现有编译器中工作(因此更容易部署)。

“是的,但是使用这种逻辑,[[maybe_unused]] 不是完全 多余和不必要的,并且永远不应该标准化吗?” 据我所知,是的。

  • 此外,问题中的示例是 clang 警告 -Wunused-lambda-capture 中的错误。请参阅 https://bugs.llvm.org/show_bug.cgi?id=35450 (2认同)