如何为析构函数指定nothrow异常说明符

How to specify nothrow exception specifier for destructor?

本文关键字:nothrow 异常 说明符 析构函数      更新时间:2023-10-16

每当Foo的析构函数不抛出时,我试图指定函数为nothrow。我可以通过使用类型特征std::is_nothrow_destructible<>来做到这一点。我怎样才能直接做到这一点?我已经尝试了以下操作,但如果我取消注释注释行,它就不会编译

#include <iostream>
#include <type_traits>
class Foo
{
public:
    ~Foo() noexcept {}
};
// void f() noexcept(noexcept(~Foo{})) { } // error here
void g() noexcept(std::is_nothrow_destructible<Foo>::value) 
{
}
int main()
{
    g();
}

我收到一个错误

 error: no match for 'operator~' (operand type is 'Foo')

错误说明符noexcept(noexcept(~Foo()))不正常,尽管对于构造函数我可以使用noexcept(noexcept(Foo()))。我是不是遗漏了一些明显的语法?

只有通过成员访问表达式才能调用析构函数。所以语法应该是:
void f() noexcept(noexcept(std::declval<Foo>().~Foo()))