模板偏特化可以缩小 C++ 中的参数类型吗?
Can template partial specialization narrow the argument type in C++?
在下一个程序中,struct template A<int>
有一个特殊化 A<char>
:
template <int>
struct A { constexpr operator int() { return 1; } };
template <char c>
struct A<c> { constexpr operator int() { return 2; } };
int main() {
static_assert( A<1000>{} == 1 ); //ok in Clang and GCC
static_assert( A<1>{} == 2 ); //ok in Clang only
}
- Clang 接受整个程序。
- GCC 接受专业化定义,但在
A<1>{}
中忽略它。
- MSVC 抱怨这种专业化:
error C2753: 'A<c>': partial specialization cannot match argument list for primary template
演示:https://gcc.godbolt.org/z/Ef95jv5E5
这里是哪个编译器?
活动的 CWG issue 1647 恰好提到了将 int
非类型模板参数特化为 char
.
的情况
它还提到该标准目前缺少措辞来处理主模板中的非类型模板参数与其偏特化之间的类型不匹配,并且在这个问题上存在实现分歧。
在下一个程序中,struct template A<int>
有一个特殊化 A<char>
:
template <int>
struct A { constexpr operator int() { return 1; } };
template <char c>
struct A<c> { constexpr operator int() { return 2; } };
int main() {
static_assert( A<1000>{} == 1 ); //ok in Clang and GCC
static_assert( A<1>{} == 2 ); //ok in Clang only
}
- Clang 接受整个程序。
- GCC 接受专业化定义,但在
A<1>{}
中忽略它。 - MSVC 抱怨这种专业化:
error C2753: 'A<c>': partial specialization cannot match argument list for primary template
演示:https://gcc.godbolt.org/z/Ef95jv5E5
这里是哪个编译器?
活动的 CWG issue 1647 恰好提到了将 int
非类型模板参数特化为 char
.
它还提到该标准目前缺少措辞来处理主模板中的非类型模板参数与其偏特化之间的类型不匹配,并且在这个问题上存在实现分歧。