请考虑以下事项:
template<class T>
struct A
{
struct B
{} static const b;
};
// case 1
template<class T>
typename A<T>::B const A<T>::b;
// case 2
template<class T>
typename A<T>::B const A<T>::b{};
int main()
{
A<int> a;
a.b;
return 0;
}
情形1:
gcc 5.2通过
msvc 2015更新1通过
clang 3.7错误:
default initialization of an object of const type 'const typename A<int>::B' without a user-provided default constructor
情况2:
gcc 5.2通过
clang 3.7 pass:
msvc 2015更新1错误:
error C2143: syntax error: missing ';' before '<end Parse>'
每种情况下哪种编译器是对还是错?
答案 0 :(得分:1)
根据C ++标准(8.5初始化程序)
所以clang正确报告了diagnostoc消息。
至于第二种情况,那么似乎使用的MS编译器不支持列表初始化或有错误。
答案 1 :(得分:0)
typename A<T>::B
是类型
A<T>::
是范围
const A<T>::
是const范围吗?
应该是:
const typename A<T>::B A<T>::b;