Я wan't отключить пользователь объявил деструкторы использования SFINAE в накидном подобном классе, как сделать это обычно для конструкторов в классах:Почему деструктор не может быть шаблоном?
#include <type_traits>
#include <cstdlib>
template< typename A, typename B >
struct U
{
constexpr U() = default;
cosntexpr U(A _a) : a(_a), s{false} { ; }
constexpr U(B _b) : b(_b), s{true} { ; }
union
{
A a;
B b;
};
bool s;
template< typename = std::enable_if_t< !(std::is_trivially_destructible<A>{} && std::is_trivially_destructible<B>{}) >, // disable if A and B is trivially destructible
bool is_noexcept = (noexcept(std::declval<A>().~A()) && noexcept(std::declval<B>().~B())) > // disable if A or B is not destructible
~U() noexcept(is_noexcept)
{
if (s) {
b.~B();
} else {
a.~A();
}
}
};
int main()
{
struct A {};
struct B {};
U< A, B > u;
static_assert(std::is_literal_type<A>{});
static_assert(std::is_literal_type<B>{}); // =>
static_assert(std::is_literal_type< U< A, B > >{});
return EXIT_SUCCESS;
}
но получил ошибку:
main.cpp:24:5: error: destructor cannot be declared as a template
~U() noexcept(is_noexcept)
^
1 error generated.
Failure!
Есть ли теоретическая причина этого ограничения в C++? Или это просто «наследие»?
@DavidHaim конструктор по умолчанию также не может получить параметры, но это может быть шаблон. – Orient
Деструктор должен быть сгенерирован, конструктор по умолчанию - нет (класс может иметь другой конструктор). – Jarod42
см. Мой ответ –