- #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=