检查 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<Widget&>())
那样就地构造它们。
lambda(std::declval以上是关于检查 lambda 是不是为 noexcept的主要内容,如果未能解决你的问题,请参考以下文章
用于检查特定标签是不是不存在的 Lambda 函数-python