【问题标题】: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

【问题讨论】:

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

标签: c++ c++11 templates lambda noexcept


【解决方案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()) 是缺失的部分。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
相关资源
最近更新 更多