考虑下面的代码:
#include <iostream>
#include <memory>
void f(std::shared_ptr<int> sp) {}
template <typename FuncType, typename PtrType>
auto call_f(FuncType f, PtrType p) -> decltype(f(p))
{
return f(p);
}
int main()
{
f(0); // doesn't work for any other int != 0, thanks @Rupesh
// call_f(f, 0); // error, cannot convert int to shared_ptr
}
在第一行中main()
, 整数0
被转换为std::shared_ptr<int>
和电话f(0)
成功,没有任何问题。但是,使用模板来调用函数会使情况有所不同。第二行将不再编译,错误是
error: could not convert 'p' from 'int' to 'std::shared_ptr<int>'
我的问题是:
- 为什么第一次调用成功而第二次失败?我在这里缺少什么吗?
- 我也不明白如何转换
int
to std::shared_ptr
正在通话中执行f(0)
,因为它看起来像std::shared_ptr
只有显式构造函数。
PS:此示例的一个变体出现在 Scott Meyers 的文章中有效的现代 C++第 8 项,作为保护此类调用的一种方法nullptr
.
std::shared_ptr有一个构造函数需要std::nullptr_t, 字面意思0
是一个空指针常量,可转换为std::nullptr_t来自 C++ 标准草案部分4.10
[转化指针] (强调我的前进):
空指针常量是整数类型的整型常量表达式 (5.19) 纯右值,其计算结果为零或类型的纯右值
std::nullptr_t。空指针常量可以转换为
指针类型;结果是该类型的空指针值,并且是
与对象指针或函数的所有其他值区分开来
指针类型。这种转换称为空指针转换。
相同类型的两个空指针值比较相等。这
将空指针常量转换为 cv 限定的指针
type 是单个转换,而不是指针的序列
转换之后是资格转换(4.4)。空值
整型指针常量可以转换为纯右值
类型 std::nullptr_t。 [ 注意:结果纯右值不为空
指针值。 ——尾注]
在你的第二种情况下p
被推导为类型int虽然其值为零,但不再是空指针常量,因此不适合相同的情况。
作为 T.C.指出措辞已更改为DR 903它需要一个值为零的整数文字,而不是积分常量表达式其计算结果为零:
空指针常量是带值的整数文字 (2.14.2)
零或 std::nullptr_t 类型的纯右值。空指针常量
可以转换为指针类型;结果是空指针
该类型的值并且可以与其他所有值区分开来
对象指针或函数指针类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)