#include <iostream>
using namespace std;
int i = 0;
struct A
{
A() { cout << "A()\n"; if(i++ > 0) throw 42; }
~A() { cout << "~A()\n"; }
void * operator new [] (size_t t, int, int)
{
cout << "3 parameters allocation" << endl;
return ::operator new[](t);
}
void operator delete [] (void *p, int, int)
{
cout << "3 parameters deallocation" << endl;
return ::operator delete[](p);
}
};
int main()
{
try{
A *a = new (5,5) A[10]; //operator new [] (size_t, int, int) invoked
}catch(...) {}
//delete [] a; //Error. Overload resolution is failed.
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IGkgPSAwOwoKc3RydWN0IEEKewoJQSgpIHsgY291dCA8PCAiQSgpXG4iOyBpZihpKysgPiAwKSB0aHJvdyA0MjsgfQoJfkEoKSB7IGNvdXQgPDwgIn5BKClcbiI7IH0KICAgIHZvaWQgKiBvcGVyYXRvciBuZXcgW10gKHNpemVfdCB0LCBpbnQsIGludCkKICAgIHsKICAgICAgICBjb3V0IDw8ICIzIHBhcmFtZXRlcnMgYWxsb2NhdGlvbiIgPDwgZW5kbDsKICAgICAgICByZXR1cm4gOjpvcGVyYXRvciBuZXdbXSh0KTsKICAgIH0KCiAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSBbXSAodm9pZCAqcCwgaW50LCBpbnQpCiAgICB7CiAgICAgICAgY291dCA8PCAiMyBwYXJhbWV0ZXJzIGRlYWxsb2NhdGlvbiIgPDwgZW5kbDsKICAgICAgICByZXR1cm4gOjpvcGVyYXRvciBkZWxldGVbXShwKTsKICAgIH0KfTsKCmludCBtYWluKCkgCnsKCXRyeXsKICAgIEEgKmEgPSBuZXcgKDUsNSkgQVsxMF07IC8vb3BlcmF0b3IgbmV3IFtdIChzaXplX3QsIGludCwgaW50KSBpbnZva2VkCgl9Y2F0Y2goLi4uKSB7fQogICAgLy9kZWxldGUgW10gYTsgLy9FcnJvci4gT3ZlcmxvYWQgcmVzb2x1dGlvbiBpcyBmYWlsZWQuCn0=