假设我们有以下代码:
void ff(wchar_t*)
{
}
template<typename T>
void ffc(T&& a)
{
ff(std::forward<T>(a));
}
为什么允许来电ff(0)
,但ffc(0)
不是?
答案 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>()
不能是常量表达式,因为函数的参数也不能是常量表达式。