C++模板部分特化由指针函数/ const指针函数没有不同?

mat*_*atb 4 c++ templates const function-pointers

我们考虑以下代码:

template <typename T>
class Foo
{};

template <typename T, typename U>
class Foo<T(*)(U* const)>
{};

template <typename T, typename U>
class Foo<T(*)(U*)>
{};
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它(ideone)时,它无法告诉我两个模板特化是相同的.这通常是令人惊讶的,U*并且U* const是不同的东西(第二个是const指针).这有什么不对?

小智 6

在确定函数的类型(通俗地称为其签名)时,将删除顶级cv限定符.

§8.3.5/ 5 ...使用以下规则确定函数的类型....生成参数类型列表后,在形成函数类型时,将删除修改参数类型的任何顶级cv限定符....

对于无效的函数指针或模板参数没有特殊规则.