#include <iostream>
#include <type_traits>

class A // trivial
{
    int dummy;
public:

    void* operator new[](std::size_t size)
    {
        std::cout << "A::new[] size = " << size << '\n';

        return ::operator new[](size);
    }
};

class B // nicht trivial
{
    int dummy;
public:

    ~B() { dummy = 0; }

    void* operator new[](std::size_t size)
    {
        std::cout << "B::new[] size = " << size << '\n';

        return ::operator new[](size);
    }
};

int main()
{
	using namespace std;
	
    A* a = new A[10];
    B* b = new B[10];

	cout << "is_trivially_destructible<A>::value = " << is_trivially_destructible<A>::value << '\n';
	cout << "is_trivially_destructible<B>::value = " << is_trivially_destructible<B>::value << '\n';
	
    delete[] b;
    delete[] a;

	return 0;
}