为什么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(在这种情况下),但Type在method2id定义的点上甚至不完整.
请解释我对此功能的理解是否错误.
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().
| 归档时间: |
|
| 查看次数: |
420 次 |
| 最近记录: |