C++ 为什么捕获列表中的[[可能未使用]]不可能?
我想知道为什么我不能在lambda的捕获列表中使用[[maybe_unused]]属性。捕获列表的变量不能标记为[[可能未使用]]有什么原因吗?这将避免在以下情况下捕获所有变量,即[&]:C++ 为什么捕获列表中的[[可能未使用]]不可能?,c++,c++17,C++,C++17,我想知道为什么我不能在lambda的捕获列表中使用[[maybe_unused]]属性。捕获列表的变量不能标记为[[可能未使用]]有什么原因吗?这将避免在以下情况下捕获所有变量,即[&]: auto lambda = [&x, [[maybe_unused]] &y](){ if constexpr( x >= 0) { return x; } else { return y; } } 在x>=0的每种情况
auto lambda = [&x, [[maybe_unused]] &y](){
if constexpr( x >= 0) {
return x;
}
else {
return y;
}
}
在x>=0的每种情况下,都有一个编译器警告未使用y。但如果x<0,则没有警告。我的第一次尝试是使用[[可能未使用]],但这是不可能的
我的问题:有什么原因,为什么我不能在lambda的捕获列表中使用[[maybe_unused]]属性?我在邮件列表中也问了同样的问题。结果是: 啊,是的,那将是一个[[可能未使用的]]可能适用的地方。 然而,就目前而言,您可以轻松地编写
(void)a;
要取消显示警告,请执行以下操作:
代码混乱(因此更易于阅读和维护),并且
在现有编译器中工作(因此更易于部署)
“是的,但是用这种逻辑,[[可能没有使用]]不是完全正确的吗
多余的和不必要的,永远不应该被标准化?”
好的,是的
它无法避免捕获,该属性仅用于消除编译器对未使用变量的警告。@super这就是重点。在x>=0的每种情况下,都有一个编译器警告未使用y。我喜欢用可能未使用的来消除警告。您可以使用默认捕获。只要做
[&](){…}代码>,它将只捕获您使用的内容。如果您希望尽可能显式,可以将默认捕获与其他显式捕获相结合<代码>[&,&x](){…}代码>例如。根据实际代码的上下文,您可能希望将其翻过来。使用帮助函数或条件运算符执行以下操作:如果x>=0,则返回捕获并返回x的lambda,否则返回捕获并返回y的lambda。此外,问题中的示例是clang warning-Wunused lambda capture中的错误。请看正确的。我也遇到了同样的错误,这在之前的几封邮件中已经讨论过了。为了回答这个问题,我只引用了(在某种程度上)解释了为什么没有可能没有使用过的,甚至在这个bug之外。