【发布时间】:2014-04-24 08:05:27
【问题描述】:
我对这段代码 sn-p 有问题:
template <typename T>
struct S
{
static int a;
};
template <typename T>
decltype(S<T>::a) S<T>::a;
clang-3.4 说:
s.cpp:8:25: error: redefinition of 'a' with a different type: 'decltype(S<T>::a)' vs 'int'
decltype(S<T>::a) S<T>::a;
^
s.cpp:4:14: note: previous definition is here
static int a;
^
1 error generated.
但gcc-4.8.2 接受。哪个编译器是正确的?我以后应该避免使用此类代码吗?
【问题讨论】:
-
+1 好问题。我最初的反应是 g++ 的接受一定是错误的,但转念一想,它一定是对的。嗯。
-
Clang 至少在 wordings 中是错误的:
previous definition is here。嗯,那是不是一个定义;这是一个声明。 -
+1。聪明的问题,它试图避免再次输入类型。以后如果想改变类型,只需要改变声明即可;它也会自动反映在定义中。
-
VC++ 也没有报错。
标签: c++ c++11 language-lawyer