I'm playing with c++20 concepts
https://godbolt.org/z/931xaeY45
#include <type_traits>
template<typename T>
class Optional
{
public:
~Optional() requires (!std::is_trivially_destructible_v<T>);
};
#include <cstdio>
int main()
{
const char* bool_value[] = {"false", "true"};
bool is_trivial = std::is_trivial_v<Optional<int>>;
bool is_trivial_destructable = std::is_trivially_destructible_v<Optional<int>>;
std::printf("std::is_trivial_v<Optional<int>> = %s\n", bool_value[is_trivial]);
std::printf("std::is_trivial_destructable<Optional<int>> = %s\n", bool_value[is_trivial_destructable]);
}
Output:
std::is_trivial_v<Optional<int>> = false
std::is_trivial_destructable<Optional<int>> = false
But, I expected that the destructor doesn't get instantiated, because for this situation requires (false) is generated for template parameter int.
Q: Why does ~Optional() requires (false) make class Optional non-trivial?