检查 lambda 是不是为 noexcept

Posted

技术标签:

【中文标题】检查 lambda 是不是为 noexcept【英文标题】:Check if a lambda is noexcept检查 lambda 是否为 noexcept 【发布时间】:2021-08-05 04:27:15 【问题描述】:

我正在尝试检查 lambda 是否为 noexcept

但看起来noexcept(lambda) 没有做我认为应该做的事情。

auto lambda = [&](Widget& w)
    w.build();
;

auto isNoexcept = noexcept(lambda) ? "yes" : "no";
std::cout << "IsNoexcept: "  << isNoexcept << std::endl;

即使 lambda 未标记 noexcept,也会打印“IsNoexcept: yes”。

我在这里做错了什么?

https://godbolt.org/z/EPfExoEad

【问题讨论】:

您想要运行时检查吗? 没有。只需编译时检查,以便正确实例化函数模板 好,我刚刚对你得到的答案投了赞成票! 【参考方案1】:

需要调用 lambda,例如

auto isNoexcept = noexcept(lambda(std::declval<Widget&>())) ? "yes" : "no";

noexcept 用于检查表达式是否抛出,而表达式 lambda,lambda 本身不会抛出,直到它被调用(使用指定的参数)。

【讨论】:

但 noexcept(lambda()) 无法编译,因为 lambda 采用特定参数。我可以在不传入实际值的情况下检查 lambda 是否为 noexcept 吗?因为我希望模板函数为 noexcept 或不是 @randomThought 一般情况下不是这样,因为您可以使用重载的operator() 来创建函子,而只有部分重载noexcept。如果你确定它没有重载也没有模板化,你可以形成一个指向成员的指针,然后使用模板特化来查看它是否有 noexcept 。 @randomThought 参数是调用 lambda 所必需的,您可以像 lambda(std::declval&lt;Widget&amp;&gt;()) 那样就地构造它们。 lambda(std::declval()) 是缺失的部分。谢谢

以上是关于检查 lambda 是不是为 noexcept的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 lambda 表达式检查元素是不是存在?

如何检查是不是未分配 lambda 表达式? [复制]

用于检查特定标签是不是不存在的 Lambda 函数-python

使用 lambda boto3 检查 ec2 是不是存在

我想检查今天在 s3 中上传的文件并检查文件是不是超过 1 小时

如何检查 kotlin 中的 lambda 空性