#include <iostream>
template<typename = void>
struct A_impl
{
static A_impl const values[];
static A_impl const& X;
static A_impl const& Y;
static A_impl const& Z;
constexpr operator int() const { return _value; }
int const _value;
};
template<typename T>
constexpr A_impl<T> const A_impl<T>::values[]{ 42, 43, 44 };
template<typename T>
constexpr A_impl<T> const& A_impl<T>::X{ values[0U] };
template<typename T>
constexpr A_impl<T> const& A_impl<T>::Y{ values[1U] };
template<typename T>
constexpr A_impl<T> const& A_impl<T>::Z{ values[2U] };
using A = A_impl<>;
template<int N>
constexpr int foo()
{
return N;
}
int main(int, char**) noexcept
{
std::cout << foo<A::values[1U]>() << "\n"
<< foo<A::Z>();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgPSB2b2lkPgpzdHJ1Y3QgQV9pbXBsCnsKCXN0YXRpYyBBX2ltcGwgY29uc3QgdmFsdWVzW107CglzdGF0aWMgQV9pbXBsIGNvbnN0JiBYOwoJc3RhdGljIEFfaW1wbCBjb25zdCYgWTsKCXN0YXRpYyBBX2ltcGwgY29uc3QmIFo7CgkKCWNvbnN0ZXhwciBvcGVyYXRvciBpbnQoKSBjb25zdCB7IHJldHVybiBfdmFsdWU7IH0KCQoJaW50IGNvbnN0IF92YWx1ZTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNvbnN0ZXhwciBBX2ltcGw8VD4gY29uc3QgQV9pbXBsPFQ+Ojp2YWx1ZXNbXXsgNDIsIDQzLCA0NCB9Owp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjb25zdGV4cHIgQV9pbXBsPFQ+IGNvbnN0JiBBX2ltcGw8VD46Olh7IHZhbHVlc1swVV0gfTsKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY29uc3RleHByIEFfaW1wbDxUPiBjb25zdCYgQV9pbXBsPFQ+OjpZeyB2YWx1ZXNbMVVdIH07CnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNvbnN0ZXhwciBBX2ltcGw8VD4gY29uc3QmIEFfaW1wbDxUPjo6WnsgdmFsdWVzWzJVXSB9OwoKdXNpbmcgQSA9IEFfaW1wbDw+OwoKdGVtcGxhdGU8aW50IE4+CmNvbnN0ZXhwciBpbnQgZm9vKCkKewoJcmV0dXJuIE47Cn0KCmludCBtYWluKGludCwgY2hhcioqKSBub2V4Y2VwdAp7CglzdGQ6OmNvdXQgPDwgZm9vPEE6OnZhbHVlc1sxVV0+KCkgPDwgIlxuIgoJCTw8IGZvbzxBOjpaPigpOwoJcmV0dXJuIDA7Cn0=