当给出明确的参数时,这(部分)从 CTAD 实例化其他专业化中减少。
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 和 GCC 似乎总是调用并从Bar
的构造函数中推断出真正的模板参数,即使给定的参数是的专门化类型Bar
,但 MSVC 不同意。
标准是怎么说的?