使用noexcept运算符链接noexcept声明

PSk*_*cik 2 c++ c++14

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

考虑以下虚拟示例:

#include <string>

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

struct Type{
  void method1() noexcept(strProcessor("")) { //Error: Call to nonconstexpr function
     strProcessor("");
  }
};
Run Code Online (Sandbox Code Playgroud)

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

我想要做的就是告诉编译器,method1如果strProcessor使用成功构造的字符串的调用是noexcept(它是),则noexcept.

那为什么不noexcept(void strProcessor(const std::string&))呢?

另一个类似的假例子:

struct Type{
   Type(bool shouldThrow=false) noexcept(false) { if(shouldThrow) throw "error"; };
   void method1() noexcept(true) {};
   void method2() noexcept(noexcept(Type().method1())) { method1(); };
}
Run Code Online (Sandbox Code Playgroud)

这里我想说的method2是noexcept iff method1在一个成功构造的Type上调用是noexcept(在这种情况下),但Typemethod2id定义的点上甚至不完整.

请解释我对此功能的理解是否错误.

Que*_*tin 9

void method1() noexcept(noexcept(strProcessor(""))) {
//   Second 'noexcept'  ^^^^^^^^^                ^
Run Code Online (Sandbox Code Playgroud)

第一个是说明noexcept ,它指定是否method1()noexcept.

嵌套的是noexcept 运算符,它在调用时检查是否strProcessor()noexcept"".

你的第二个案例有点棘手:Type在我们想要method1()在内部使用的那一点仍然是不完整的noexcept.我来到以下解决方法,滥用指向成员的指针:

void method2() noexcept(noexcept(
    (std::declval<Type>().*&Type::method1)()
)) {};
Run Code Online (Sandbox Code Playgroud)

不过,我不认为有,你只能推断出的情况下method2()noexcept从规范method1().