为什么在完美转发中不允许隐式转换
Why are implicit conversion not allowed in prefect forwarding?
假设我们有以下代码:
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标准草案(N4140
)4.10
指针转换[conv.ptr]一节中看到,具有零值的int是不够的,它必须是整数文字,或者必须是std::nullptr_t:的prvalue
空指针常量是值为零的整数文本(2.14.2)或std::nullptr_t类型的prvalue。空指针常量可以转换为指针类型;结果是该类型的空指针值并且可与对象指针或函数指针类型的每一个其它值区分开。这样的转换称为空指针转换。[…]
在C++11中,措辞允许积分常数表达式求值为零,但在这种情况下实际上无关紧要,因为正如T.C.所指出的,std::forward<T>()
不可能是常数表达式,因为函数的参数也不可能是常量表达式。
相关文章:
- Visual C++(VS2017)中用户定义的转换不明确
- 为什么 Clang 不允许"and"作为函数名称?
- 不允许在向量中添加更多元素
- std::带有自定义缓冲区的 iostream 不允许我写入
- Visual Studio 2017 不允许我创建 C++ 专用模板
- 返回时不允许隐式转换
- 为什么 c++ 不允许(自动)强制转换?
- 函数 C::add() 中不允许将'C *'隐式转换为'A *'
- 静态强制转换允许转换对象指针,但不允许转换整数
- QT中不允许使用一行多个转换,例如qString到char*
- ISO C++11 不允许从字符串转换为字符
- 不允许转换为无法访问的基类
- 为什么不允许从 VirtualBase::* 转换为 Derived::*?
- 描述为什么不允许在C++中将基类指针转换为派生类指针
- 不允许对自定义类型进行多次隐式转换?
- 为什么 C 不允许从 char ** 隐式转换为 const char *const *(C++允许)?
- int* 转换不允许 int 错误的原因是什么?
- 为什么在完美转发中不允许隐式转换
- 在ARC中不允许对Objective-C指针进行隐式转换
- 在const wchar_t*和const char*之间进行转换,不允许使用qt