为什么noexcept
运算符使用表达式而不是函数签名/声明?
考虑下面的虚拟示例:
#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&))
另一个类似的虚拟例子:
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定义的点上还没有完成。
如果我对这个特性的理解是错误的,请解释。
发布于 2015-07-27 13:37:04
void method1() noexcept(noexcept(strProcessor(""))) {
// Second 'noexcept' ^^^^^^^^^ ^
第一个是 ,指定method1()
是否为not以外的。
嵌套的一个是 ,检查是否为is,除非使用""
调用。
第二个例子有点棘手:Type
在我们希望在noexcept
中使用method1()
的时候还不完整。我已经找到了以下解决办法,滥用指针对成员:
void method2() noexcept(noexcept(
(std::declval<Type>().*&Type::method1)()
)) {};
但是,我认为没有一种情况只能从method2()
的规范中推断出method1()
的you。
https://stackoverflow.com/questions/31654435
复制相似问题