【发布时间】:2017-04-29 20:06:20
【问题描述】:
#include <type_traits>
template <typename T>
struct C;
template<typename T1, typename T2>
using first = T1;
template <typename T>
struct C<first<T, std::enable_if_t<std::is_same<T, int>::value>>>
{
};
int main ()
{
}
不同编译器编译结果:
MSVC:
错误 C2753:“C”:部分特化无法匹配主模板的参数列表
gcc-4.9:
错误:部分专业化'C'不专业从任何模板参数
clang 所有版本:
错误:类模板部分特化没有特化任何模板参数;要定义主模板,请删除模板参数列表
gcc-5+: 编译成功
和辅助我想指出琐碎的专业化,如:
template<typename T>
struct C<T>
{
};
gcc 编译成功失败。所以它似乎发现我原来的例子中的专业化是不平凡的。所以我的问题是 - C++ 标准是否明确禁止这样的模式?
【问题讨论】:
-
@T.C.我在写作过程中,推论需要将参数替换为
P中的非推导事件(因此第二个模板更专业,因为唯一的合成类型将无法触发is_same的部分专业化),但我'不确定这在任何地方的措辞中是否明确,也不确定它实际适用的程度。 -
@Columbo [temp.deduct.type]/1 的结尾(“这将在替换推导值后生成 P(称为推导 A)”),有点?但我认为无论如何都不清楚如何处理这种替换。如果特征是
template<class T> struct is_not_int : true_type {}; template<> struct is_not_int<int> : false_type {};怎么办?严格的阅读会说部分专业化是无效的,但这似乎......充其量是奇怪的。 -
@Columbo 那部分基本上是wg21.link/cwg1157,由于别名模板而额外扭曲。
标签: c++ templates gcc language-lawyer sfinae