2

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();
}

エラーが発生する

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

エラー指定子noexcept(noexcept(~Foo()))は OK ではありませんが、コンストラクターには を使用できますnoexcept(noexcept(Foo()))。ここにいくつかの明らかな構文がありませんか?

4

1 に答える 1

5

デストラクターは、メンバー アクセス式を介してのみ呼び出すことができます。したがって、構文は次のようになります。

void f() noexcept(noexcept(std::declval<Foo>().~Foo()))
于 2015-02-19T01:49:23.460 に答える