如何使用右值引用包装指针
How does wrapping a pointer work with rvalue references?
std::shared_ptr::operator*按左值引用返回,这里对重载指针类操作给出的答案是,约定是按左值引用返回。然而,当我使用以下代码时,我得到错误C2664: 'AdjacencyList::addVertex':不能将参数1从'AdjacencyList::vertex_type'转换为'AdjacencyList::vertex_type &&':你不能将左值绑定到右值引用:
std::shared_ptr<vertex_type> AdjacencyList::addVertex(vertex_type&& v)
{
auto existingVertex(findVertex(v));
if (!existingVertex.isValid())
{
existingVertex = std::make_shared<vertex_type>(std::forward<vertex_type>(v))
m_vertices.push_back(existingVertex);
}
return existingVertex;
};
AdjacencyList minimumSpanningTree;
// startVertex is a shared_ptr to a vertex returned from a previous call of addVertex
// on another AdjacencyList object
const auto mstStartVertex(minimumSpanningTree.addVertex(*startVertex));
我应该提供AdjacencyList::addVertex(const vertex_type&v)或改变在上面块的底部的代码,使顶点的副本传递给addVertex之前?
AdjacencyList minimumSpanningTree;
Vertex s(*startVertex);
const auto mstStartVertex(minimumSpanningTree.addVertex(std::move(s)));
我认为您应该从operator*
返回一个副本,因为std::weak_ptr
的语义表明您不能保证返回的引用将保持有效。由于返回的副本随后被赋予一个可以将其移动到其他地方的函数,因此它也应该足够有效,因为addVertex
看起来无论如何都需要副本,即,如果将创建addVertex
的重载,它将在内部创建传递的const引用的副本,会吗?
就冗余副本而言,最有效的方法是提供右值和const引用重载:
std::shared_ptr<vertex_type> AdjacencyList::addVertex(vertex_type&&);
std::shared_ptr<vertex_type> AdjacencyList::addVertex(const vertex_type&);
为了消除多余的代码,您可以转发到一个模板方法,或者转发到一个接受bool
标志并执行const_cast
的具体方法。
如果复制Vertex
对象的开销与增加代码的开销相比是最小的,并且如果if
块通常或经常被输入,那么冗余复制将使您的代码更清晰。你的第二个建议调用将更好地工作,如果你只是创建一个不需要移动的右值临时:
const auto mstStartVertex(minimumSpanningTree.addVertex(Vertex{*startVertex}));
然而,在这种情况下,您不妨通过提供单值重载(如何在添加新的c++0x右值引用操作符重载时减少冗余代码)在调用本身中创建临时对象:
std::shared_ptr<vertex_type> AdjacencyList::addVertex(vertex_type);
- C结构,其指针将被包装在unique_ptr中
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 如何包装多级原始指针以赋予其容器语义
- SDL 包装标头中的智能指针
- 将捕获的 lambda 包装为模板函数中的函数指针
- 智能指针包装CoTaskMemAlloc和CoTaskMemFree
- 包装 C API 通过C++接受迭代器的函数获取原始指针
- std::带有指向成员函数和back_inserter的指针的转换包装器
- 如何使用指针作为参数在 C# 中包装C++ DLL?
- 重置/包装 C/C++ 中的变量(环缓冲区指针)
- 使用可变参数模板(gcc、clang)的成员函数指针包装器
- Qvariant包装指针在QML中变为null
- C 11 / 14-是否有针对其他地方管理的资源的原始指针包装器
- 编写安全包装类以管理用户定义对象的指针
- 用Cython包装C 类时处理指针
- 为什么编译器不优化琐碎的包装器函数指针?
- 简单包装类与智能指针
- 字符指针包装器的运算符>>
- 通过简单的包装指针C++智能指针性能和差异
- 如何使用右值引用包装指针