首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用noexcept运算符链接noexcept声明

使用noexcept运算符链接noexcept声明
EN

Stack Overflow用户
提问于 2015-07-27 13:29:38
回答 2查看 674关注 0票数 3

为什么noexcept运算符使用表达式而不是函数签名/声明?

考虑下面的虚拟示例:

代码语言:javascript
运行
复制
#include <string>

void strProcessor(const std::string& str) noexcept(true) { };

struct Type{
  void method1() noexcept(strProcessor("")) { //Error: Call to nonconstexpr function
     strProcessor("");
  }
};

它不会编译,因为method1在它的non中有一个非constexpr表达式,但是为什么我首先需要在其中放一个表达式呢?

我所要做的就是告诉编译器,method1 是which,除非使用一个连续构造的字符串对 strProcessor 的调用是do,但(它确实是)。

所以为什么不noexcept(void strProcessor(const std::string&))

另一个类似的虚拟例子:

代码语言:javascript
运行
复制
struct Type{
   Type(bool shouldThrow=false) noexcept(false) { if(shouldThrow) throw "error"; };
   void method1() noexcept(true) {};
   void method2() noexcept(noexcept(Type().method1())) { method1(); };
}

在这里,我想说的是,method2 只是在构造成功的Type实例上调用 method1 (在本例中是)的当且仅当,但是Type甚至在method2 id定义的点上还没有完成。

如果我对这个特性的理解是错误的,请解释。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-27 13:37:04

代码语言:javascript
运行
复制
void method1() noexcept(noexcept(strProcessor(""))) {
//   Second 'noexcept'  ^^^^^^^^^                ^

第一个是 指定method1()是否为not以外的

嵌套的一个是 检查是否为is,除非使用""调用。

第二个例子有点棘手:Type在我们希望在noexcept中使用method1()的时候还不完整。我已经找到了以下解决办法,滥用指针对成员:

代码语言:javascript
运行
复制
void method2() noexcept(noexcept(
    (std::declval<Type>().*&Type::method1)()
)) {};

但是,我认为没有一种情况只能从method2()的规范中推断出method1()的you。

票数 12
EN

Stack Overflow用户

发布于 2015-07-27 13:39:58

如果在检查函数的noexcept性时需要一些语法糖,则可以使用以下辅助函数:

代码语言:javascript
运行
复制
template <typename R, typename... Params>
constexpr bool is_noexcept(R(*p)(Params...)) {
    return noexcept(p(std::declval<Params>()...));
}

并适用于:

代码语言:javascript
运行
复制
void method1() noexcept(is_noexcept(strProcessor)) …

Demo

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31654435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档