Я пытаюсь указать, что функция 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()))
, Я пропускаю какой-то очевидный синтаксис здесь?
Деструкторы могут быть вызваны только через выражение доступа к члену. Таким образом, синтаксис будет:
void f() noexcept(noexcept(std::declval<Foo>().~Foo()))