#include <iostream>
#include <type_traits>
template <std::size_t SIZE> class A
{
char b[SIZE];
public:
using const_buffer_t = const char (&)[SIZE];
A() : b{} { std::cout << "size: " << SIZE << " ctor 1\n"; }
A(const_buffer_t) : b{} { std::cout << "size: " << SIZE << " ctor 2\n"; }
explicit A(const A&) : b{} { std::cout << "size: " << SIZE << " ctor 4\n"; }
template <typename T,
typename=typename std::enable_if<
std::is_same<typename std::remove_cv<T>::type, char>{}
>::type>
A(T* const&) : b{} { std::cout << "size: " << SIZE << " ctor 3\n"; }
template <std::size_t OTHER_SIZE>
A(const char (&)[OTHER_SIZE]) : b{} { std::cout << "size: " << SIZE << " ctor 5\n"; }
template <std::size_t OTHER_SIZE>
explicit A(const A<OTHER_SIZE> &) : b{} { std::cout << "size: " << SIZE << " ctor 6\n"; }
};
int main()
{
A<5> a("five");
A<5> b("0123456789");
A<9> c(a);
A<5> d;
A<5> e(d);
A<9> f(d);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgU0laRT4gY2xhc3MgQQp7CiAgICBjaGFyIGJbU0laRV07CgpwdWJsaWM6Cgl1c2luZyBjb25zdF9idWZmZXJfdCA9IGNvbnN0IGNoYXIgKCYpW1NJWkVdOwoKCUEoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJ7fSB7IHN0ZDo6Y291dCA8PCAic2l6ZTogIiA8PCBTSVpFIDw8ICIgY3RvciAxXG4iOyB9CglBKGNvbnN0X2J1ZmZlcl90KSAgICAgICAgICAgICAgICAgOiBie30geyBzdGQ6OmNvdXQgPDwgInNpemU6ICIgPDwgU0laRSA8PCAiIGN0b3IgMlxuIjsgfQoJZXhwbGljaXQgQShjb25zdCBBJikgICAgICAgICAgICAgIDogYnt9IHsgc3RkOjpjb3V0IDw8ICJzaXplOiAiIDw8IFNJWkUgPDwgIiBjdG9yIDRcbiI7IH0KCQoJdGVtcGxhdGUgPHR5cGVuYW1lIFQsCgkgIHR5cGVuYW1lPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAoJICAgIHN0ZDo6aXNfc2FtZTx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jdjxUPjo6dHlwZSwgY2hhcj57fQoJICA+Ojp0eXBlPgoJQShUKiBjb25zdCYpICAgICAgICAgICAgICAgICAgICAgIDogYnt9IHsgc3RkOjpjb3V0IDw8ICJzaXplOiAiIDw8IFNJWkUgPDwgIiBjdG9yIDNcbiI7IH0KCgl0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgT1RIRVJfU0laRT4KCUEoY29uc3QgY2hhciAoJilbT1RIRVJfU0laRV0pICAgICA6IGJ7fSB7IHN0ZDo6Y291dCA8PCAic2l6ZTogIiA8PCBTSVpFIDw8ICIgY3RvciA1XG4iOyB9CgoJdGVtcGxhdGUgPHN0ZDo6c2l6ZV90IE9USEVSX1NJWkU+CglleHBsaWNpdCBBKGNvbnN0IEE8T1RIRVJfU0laRT4gJikgOiBie30geyBzdGQ6OmNvdXQgPDwgInNpemU6ICIgPDwgU0laRSA8PCAiIGN0b3IgNlxuIjsgfQp9OwoKaW50IG1haW4oKQp7CglBPDU+IGEoImZpdmUiKTsKCUE8NT4gYigiMDEyMzQ1Njc4OSIpOwoJQTw5PiBjKGEpOwoJQTw1PiBkOwoJQTw1PiBlKGQpOwoJQTw5PiBmKGQpOwp9Cg==