#include <iostream>
template <std::size_t SIZE> class A
{
char b[SIZE];
public:
using const_buffer_t = const char (&)[SIZE];
using my_type = A<SIZE>;
A() : b{} { std::cout << "size: " << SIZE << " ctor 1\n"; }
A(const_buffer_t) : b{} { std::cout << "size: " << SIZE << " ctor 2\n"; }
template <typename=void>
A(const char * const) : b{} { std::cout << "size: " << SIZE << " ctor 3\n"; }
explicit A(const my_type &) : b{} { std::cout << "size: " << SIZE << " ctor 4\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);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHN0ZDo6c2l6ZV90IFNJWkU+IGNsYXNzIEEKewoJY2hhciBiW1NJWkVdOwoKcHVibGljOgoJdXNpbmcgY29uc3RfYnVmZmVyX3QgPSBjb25zdCBjaGFyICgmKVtTSVpFXTsKCXVzaW5nIG15X3R5cGUgPSBBPFNJWkU+OwoJCglBKCkJCQkJCQkJOiBie30geyBzdGQ6OmNvdXQgPDwgInNpemU6ICIgPDwgU0laRSA8PCAiIGN0b3IgMVxuIjsgfQoJQShjb25zdF9idWZmZXJfdCkJCQk6IGJ7fSB7IHN0ZDo6Y291dCA8PCAic2l6ZTogIiA8PCBTSVpFIDw8ICIgY3RvciAyXG4iOyB9CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWU9dm9pZD4KCUEoY29uc3QgY2hhciAqIGNvbnN0KQkJOiBie30geyBzdGQ6OmNvdXQgPDwgInNpemU6ICIgPDwgU0laRSA8PCAiIGN0b3IgM1xuIjsgfQoJZXhwbGljaXQgQShjb25zdCBteV90eXBlICYpCTogYnt9IHsgc3RkOjpjb3V0IDw8ICJzaXplOiAiIDw8IFNJWkUgPDwgIiBjdG9yIDRcbiI7IH0KCgl0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgT1RIRVJfU0laRT4KCUEoY29uc3QgY2hhciAoJilbT1RIRVJfU0laRV0pIDogYnt9IHsgc3RkOjpjb3V0IDw8ICJzaXplOiAiIDw8IFNJWkUgPDwgIiBjdG9yIDVcbiI7IH0KCgl0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgT1RIRVJfU0laRT4KCWV4cGxpY2l0IEEoY29uc3QgQTxPVEhFUl9TSVpFPiAmKSA6IGJ7fSB7IHN0ZDo6Y291dCA8PCAic2l6ZTogIiA8PCBTSVpFIDw8ICIgY3RvciA2XG4iOyB9Cn07CgppbnQgbWFpbigpCnsKCS8vQTw1PiBhKCJmaXZlIik7CglBPDU+IGIoIjAxMjM0NTY3ODkiKTsKCS8vQTw5PiBjKGEpOwoJQTw1PiBkOwoJQTw1PiBlKGQpOwoJQTw5PiBmKGQpOwoKCXJldHVybiAwOwp9
prog.cpp: In function ‘int main()’:
prog.cpp:27:21: error: call of overloaded ‘A(const char [11])’ is ambiguous
A<5> b("0123456789");
^
prog.cpp:27:21: note: candidates are:
prog.cpp:18:2: note: A<SIZE>::A(const char (&)[OTHER_SIZE]) [with unsigned int OTHER_SIZE = 11u; unsigned int SIZE = 5u]
A(const char (&)[OTHER_SIZE]) : b{} { std::cout << "size: " << SIZE << " ctor 5\n"; }
^
prog.cpp:15:11: note: A<SIZE>::A(const my_type&) [with unsigned int SIZE = 5u; A<SIZE>::my_type = A<5u>]
explicit A(const my_type &) : b{} { std::cout << "size: " << SIZE << " ctor 4\n"; }
^
prog.cpp:14:2: note: A<SIZE>::A(const char*) [with <template-parameter-2-1> = void; unsigned int SIZE = 5u]
A(const char * const) : b{} { std::cout << "size: " << SIZE << " ctor 3\n"; }
^