模板类型推导执行隐式数组到指针转换

Dan*_*nte 3 c++ c++11

我已经阅读了有关此标准转换的现有问题.但是,我找不到令人满意的答案.

我有这段代码,表明T*选择了重载T&&.根据我的理解,转发引用重载应绑定所有内容,除非另一个重载是完美匹配.

在下面的代码中,tab是一个char const(&)[4].

有人可以向我解释为什么在这里执行数组到指针的转换吗?如果有办法解决转换问题,我全都耳朵!

(coliru 链接)

#include <utility>

template <typename T>
void f(T&& lol)
{
}

template <typename T>
void f(T* pof)
{
  static_assert(sizeof(T) && false, "");
}

template <typename T>
struct S;

int main(int argc, char *argv[])
{
  decltype("lol") tab = "lol";
  S<decltype(tab)> s;
  f("lol");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Hay*_*ayt 5

数组被推导为Ptr类型.

http://en.cppreference.com/w/cpp/language/template_argument_deduction

在扣除开始之前,对P和A进行以下调整:

1)如果P不是参考类型,

a)如果A是数组类型,则A由从数组到指针转换获得的指针类型替换;

b)否则,如果A是函数类型,则A由从函数到指针转换获得的指针类型替换;

c)否则,如果A是cv限定类型,则忽略顶级cv限定符以进行推导