Isso é (parcialmente) reduzido de CTAD instancia outra especialização quando argumento explícito é fornecido .
https://godbolt.org/z/5To7nKEP3
template<int N>
struct Bar {
int n = N;
constexpr Bar() {}
constexpr Bar(const Bar& b): n{b.n - 1} {}
};
template<Bar b> constexpr int get_n() { return b.n; }
constexpr auto b = Bar<1>{};
static_assert(b.n == 1);
#ifdef _MSC_VER
static_assert(get_n<b>() == 1);
#else
static_assert(get_n<b>() == 0);
#endif
Clang e GCC parecem sempre invocar e deduzir dos Bar
construtores de para determinar o argumento do modelo real , mesmo que o argumento fornecido seja do tipo de especialização de Bar
, com o que o MSVC não concorda.
O que diz a norma?