让我们考虑这个简单的例子:
template<class T>
struct A{
template<class V,class=void>
struct B{
static const int value=1 ;
};
};
#ifdef PRE_INSTANTIATION
A<int> a;
#endif
#ifdef PARTIAL_SPECIALIZATION_OF_TEMPLATE_MEMBER
template<class T>
template<class V>
struct A<T>::B<double,V>{
static const int value = 2;
};
#else //PARTIAL_SPECIALIZATION_OF_SPECIALIZATION_MEMBER
template<>
template<class V>
struct A<int>::B<double,V>{
static const int value = 2;
};
#endif
static_assert(A<int>::B<int>::value==1,"");
#if __clang__ && PRE_INSTANTIATION && PARTIAL_SPECIALIZATION_OF_TEMPLATE_MEMBER
//Unexpected =>
static_assert(A<int>::B<double>::value==1,"");
#else //Expected =>
static_assert(A<int>::B<double>::value==2,"");
#endif
clang不考虑
template B
的部分特化。海湾合作委员会一直认为。仅当在声明A<int>
的部分特化之前强制A<T>::B
实例化时,clang才具有这种“意外”行为。如果我们声明专用主模板A<int>::B
的部分专用化,则clang具有预期的行为。c是正确的吗?还是这里有未诊断的UB?
请注意,自c++ 11支持以来,所有clang版本都具有此行为,而自c++ 11支持以来,所有gcc版本都具有“预期”行为。 Code here
最佳答案
这core language issue #1755。
根据建议中的指示,
行为可以标准化[N4090]:
在当前的c++标准中,它尚未标准化,构造良好,但是结果不确定。
报告为clang's bug #17294
关于c++ - 我们可以在实例化封闭类模板之后声明模板类成员的部分特化吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51513534/