声明中带有函数模板参数的sizeof与定义不匹配
下面的程序
template<int>
struct R{};
struct S
{
template<typename T>
auto f(T t) -> R<sizeof(t)>;
};
template<typename T>
auto S::f(T t) -> R<sizeof(t)> {}
用 Clang 编译,但 GCC 10.2 给出了一个错误的定义 f
错误:没有声明匹配 'R<sizeof (t)> S::f(T)'
这看起来像一个 GCC 错误,特别是因为 GCC 主干目前提供了一个 ICE
内部编译器错误:相同类型的规范类型不同 'R<sizeof (t)>' 和 'R<sizeof (t)>'
此外,当声明和定义中的返回类型都更改为时,GCC 会编译程序 R<sizeof (T)>.
程序是否有效?
这是演示。