Как указать спецификатор исключения 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();
}

Я получаю ошибку

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

Спецификатор ошибки noexcept(noexcept(~Foo())) не в порядке, хотя для конструкторов я могу использовать noexcept(noexcept(Foo())), Я пропускаю какой-то очевидный синтаксис здесь?

2

Решение

Деструкторы могут быть вызваны только через выражение доступа к члену. Таким образом, синтаксис будет:

void f() noexcept(noexcept(std::declval<Foo>().~Foo()))
5

Другие решения


По вопросам рекламы [email protected]