#include <iostream>
struct A
{
static A const DEFAULT;
constexpr A(int value = {}) : _value{ value } {}
constexpr operator int() const { return _value; }
int const _value;
};
constexpr A const A::DEFAULT{};
template<typename = void>
struct B_impl
{
static B_impl const DEFAULT;
constexpr B_impl(int value = {}) : _value{ value } {}
constexpr operator int() const { return _value; }
int const _value;
};
template<typename T>
constexpr B_impl<T> const B_impl<T>::DEFAULT{};
using B = B_impl<>;
template<int N>
constexpr int foo() { return N; }
int main(int, char**) noexcept
{
std::cout << "A: " << foo<A::DEFAULT>() << "\n"; // IntelliSense hates this
std::cout << "B: " << foo<B::DEFAULT>() << "\n"; // VC++ and clang die here:
// MSVC error: C2975 'N': invalid template argument for 'foo', expected compile-time constant expression
// clang error: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'N'
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEEKewogICAgc3RhdGljIEEgY29uc3QgREVGQVVMVDsKCiAgICBjb25zdGV4cHIgQShpbnQgdmFsdWUgPSB7fSkgOiBfdmFsdWV7IHZhbHVlIH0ge30KCiAgICBjb25zdGV4cHIgb3BlcmF0b3IgaW50KCkgY29uc3QgeyByZXR1cm4gX3ZhbHVlOyB9CgogICAgaW50IGNvbnN0IF92YWx1ZTsKfTsKCmNvbnN0ZXhwciBBIGNvbnN0IEE6OkRFRkFVTFR7fTsKCnRlbXBsYXRlPHR5cGVuYW1lID0gdm9pZD4Kc3RydWN0IEJfaW1wbAp7CiAgICBzdGF0aWMgQl9pbXBsIGNvbnN0IERFRkFVTFQ7CgogICAgY29uc3RleHByIEJfaW1wbChpbnQgdmFsdWUgPSB7fSkgOiBfdmFsdWV7IHZhbHVlIH0ge30KCiAgICBjb25zdGV4cHIgb3BlcmF0b3IgaW50KCkgY29uc3QgeyByZXR1cm4gX3ZhbHVlOyB9CgogICAgaW50IGNvbnN0IF92YWx1ZTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNvbnN0ZXhwciBCX2ltcGw8VD4gY29uc3QgQl9pbXBsPFQ+OjpERUZBVUxUe307Cgp1c2luZyBCID0gQl9pbXBsPD47Cgp0ZW1wbGF0ZTxpbnQgTj4KY29uc3RleHByIGludCBmb28oKSB7IHJldHVybiBOOyB9CgppbnQgbWFpbihpbnQsIGNoYXIqKikgbm9leGNlcHQKewogICAgc3RkOjpjb3V0IDw8ICJBOiAiIDw8IGZvbzxBOjpERUZBVUxUPigpIDw8ICJcbiI7IC8vIEludGVsbGlTZW5zZSBoYXRlcyB0aGlzCiAgICBzdGQ6OmNvdXQgPDwgIkI6ICIgPDwgZm9vPEI6OkRFRkFVTFQ+KCkgPDwgIlxuIjsgLy8gVkMrKyBhbmQgY2xhbmcgZGllIGhlcmU6CiAgICAvLyBNU1ZDIGVycm9yOiAgQzI5NzUgICdOJzogaW52YWxpZCB0ZW1wbGF0ZSBhcmd1bWVudCBmb3IgJ2ZvbycsIGV4cGVjdGVkIGNvbXBpbGUtdGltZSBjb25zdGFudCBleHByZXNzaW9uCiAgICAvLyBjbGFuZyBlcnJvcjogIG5vdGU6IGNhbmRpZGF0ZSB0ZW1wbGF0ZSBpZ25vcmVkOiBpbnZhbGlkIGV4cGxpY2l0bHktc3BlY2lmaWVkIGFyZ3VtZW50IGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgJ04nCiAgICByZXR1cm4gMDsKfQo=