为什么在完美转发中不允许隐式转换?

时间:2015-11-27 01:24:07

标签: c++ type-conversion implicit

假设我们有以下代码:

void ff(wchar_t*)
{

}

template<typename T>
void ffc(T&& a)
{
    ff(std::forward<T>(a));
}

为什么允许来电ff(0),但ffc(0)不是?

1 个答案:

答案 0 :(得分:5)

ffc(0)的情况下,T将被推断为 int ,因为0是一个整数文字,其类型为 int 且没有即使没有转发,也会从int到 wchar_t * 进行有效的隐式转换,因此以下情况也不起作用:

template<typename T>
void ffc_no_forward(T&& a)
{
    ff(a);
}

而在第一种情况下,0是一个空指针常量,因此完全有效转换为 wchar_t *

我们可以从草案C ++ 14标准(N4140)部分4.10中看到指针转换[conv.ptr], int 零值是不够的它必须是整数文字或必须是 std :: nullptr_t 的prvalue:

  

空指针常量是值为零的整数文字(2.14.2)或类型为std :: nullptr_t的prvalue。   空指针常量可以转换为指针类型;结果是该类型的空指针值   并且可以与对象指针或函数指针类型的每个其他值区分开。这样的转换   被称为空指针转换。[...]

在C ++ 11中,措辞允许积分常量表达式评估为零但在这种情况下实际上无关紧要,因为作为T.C.指出std::forward<T>()不能是常量表达式,因为函数的参数也不能是常量表达式。