【发布时间】:2022-01-15 09:56:09
【问题描述】:
在下一个程序中,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
哪个编译器在这里?
【问题讨论】:
-
我不认为这就是人们在编写标准时所说的部分专业化的意思。所以你会得到各种随机的东西。
标签: c++ templates language-lawyer partial-specialization