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

Why are implicit conversion not allowed in prefect forwarding?

本文关键字:转换 不允许 完美 转发 为什么      更新时间:2023-10-16

假设我们有以下代码:

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

为什么呼叫ff(0)是允许的,而ffc(0)是不允许的?

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

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

而在第一种情况下CCD_ 5是空指针常数并且因此是到wchar_t*的完全有效的转换。

我们可以从C++14标准草案(N41404.10指针转换[conv.ptr]一节中看到,具有零值的int是不够的,它必须是整数文字,或者必须是std::nullptr_t:的prvalue

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

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