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

vso*_*tco 2 c++ exception c++11 nothrow

我试图指定一个函数是nothrow每当析构函数Foo不抛出时.我可以通过使用类型特征来做到这一点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();
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

 error: no match for 'operator~' (operand type is 'Foo')
Run Code Online (Sandbox Code Playgroud)

错误说明符noexcept(noexcept(~Foo()))不正常,但对于我可以使用的构造函数noexcept(noexcept(Foo())).我在这里错过了一些明显的语法吗?

0x4*_*2D2 5

只能通过成员访问表达式调用析构函数.所以语法是:

void f() noexcept(noexcept(std::declval<Foo>().~Foo()))
Run Code Online (Sandbox Code Playgroud)

  • @ 0x499602D2更大的问题是"什么是`~Foo()`应该销毁?" (2认同)
  • @vsoftco构造函数创建一个新实例,必须在现有实例上调用析构函数.`declval`表达式提供了这个实例(实际上没有创建). (2认同)
  • @ 0x499602D2:我不认为它是*不明确的*...`~Foo()`明确地否定了一个默认构造的`Foo`,因为只有当成员函数调用语法ala`a_foo时才考虑析构函数.~美孚()`. (2认同)