为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?

vit*_*aut 6 c++ gcc clang name-mangling type-alias

考虑以下示例:

struct A {
  using type = int;
};

template <typename T>
using B = A;

template <typename T>
typename B<T>::type f() { return {}; }

template B<int>::type f<int>();
Run Code Online (Sandbox Code Playgroud)

Clang 生成符号,int f<int>()而 GCC 生成B::type f<int>()实例化:https : //godbolt.org/z/MCCza4

为什么不同意的编译器,不应该GCC还决心B::typeint

vit*_*aut 1

这是一个已知的 C++ CWG(核心工作组)问题: https: //wg21.cmeerw.net/cwg/issue2037,引用Richard Smith

一方面,别名模板可以引入 SFINAE 条件,因此它应该依赖于实例化并受到破坏。另一方面,语言规则允许使用扩展别名模板的结果重新声明该模板,因此对其进行修改是不正确的。