模板函数中使用的类的前向声明不是由clang ++编译的

scd*_*dmb 12 c++ templates g++ forward-declaration clang++

有这个代码:

class A;

template <class T>
void fun() {
   A a;
}

class A { 
public: 
   A() {  } 
};

int main() { 
   fun<int>(); 
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

g ++ 4.5和g ++ 4.7编译时没有错误.但是clang ++ 3.2(trunk)给出了这个错误:

main.cpp:5:6: error: variable has incomplete type 'A'
   A a;
     ^
main.cpp:1:7: note: forward declaration of 'A'
class A;
      ^
Run Code Online (Sandbox Code Playgroud)

根据C++标准,哪个编译器是正确的?

Dav*_*men 12

根据C++标准,哪个编译器是正确的?

两者都是正确的.这是一个不正常的计划.我的重点:

N329014.69
如果非依赖名称中使用的类型在定义模板但在完成实例化时完成,并且该类型的完整性影响是否完整程序形式良好或影响程序的语义,程序不正确; 无需诊断.

这铿锵++等编译器在这里做出具的诊断是一个可有可无的添加功能,但诊断是不是强制性的.该条款"该程序格式错误;不需要诊断"使编译器开发人员可以在这种情况下自由执行任何操作并且仍然符合要求.


小智 5

据我所知,Clang是正确的.在你的功能乐趣,你不知道A的大小,并且因为你分配A,你需要知道它的大小.在我看来,gcc是在这里原谅的方式.