将一些 C++11 代码从 Clang 移植到 g++
template<class T>
using value_t = typename T::value_type;
template<class>
struct S
{
using value_type = int;
static value_type const C = 0;
};
template<class T>
value_t<S<T>> // gcc error, typename S<T>::value_type does work
const S<T>::C;
int main()
{
static_assert(S<int>::C == 0, "");
}
为 Clang(版本 3.1 到 SVN 主干)与任何 g++ 版本提供不同的行为。对于后者,我得到这样的错误
prog.cc:13:13: error: conflicting declaration 'value_t<S<T> > S< <template-parameter-1-1> >::C' const S<T>::C; ^ prog.cc:8:29: note: previous declaration as 'const value_type S< <template-parameter-1-1> >::C' static value_type const C = 0; ^ prog.cc:13:13: error: declaration of 'const value_type S< <template-parameter-1-1> >::C' outside of class is not definition [-fpermissive] const S<T>::C;
value_t<S<T>>
如果我使用完整的而不是模板别名,typename S<T>::value_type
那么g++ 也可以。
问题:模板别名不应该与其底层表达式完全互换吗?这是一个 g++ 错误吗?
更新:Visual C++ 也接受类外定义中的别名模板。