std :: shared_ptr :: operator *通過左值引用返回,並且在重載指針(如操作here)上給出的答案表示約定是通過左值引用返回的。但是,當我使用以下代碼時,出現錯誤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));
我應該提供鄰接表:: addVertex(常量vertex_type & v)或改變以上述塊的底部的代碼傳遞到addVertex之前,使頂點的副本?
AdjacencyList minimumSpanningTree;
Vertex s(*startVertex);
const auto mstStartVertex(minimumSpanningTree.addVertex(std::move(s)));
它不一定會生成頂點的副本;目前我看看是否已經添加了相同的頂點,如果有,我什麼都不做。在大多數情況下,它會複製。 – masrtis 2013-04-10 05:36:31
更新後,我不確定是否理解'weak_ptr'或包裝器的需要。你爲什麼不只是返回'std :: shared_ptr'? –
2013-04-10 05:40:16
如果AdjacencyList超出範圍或頂點被刪除,但某人正在頂住頂點,我不想保留頂點信息。最好的例子,雖然與我的特定用例無關,但我可以想到的是爲具有動態導航圖的遊戲中的多個幀中運行的多個代理程序安排路徑查找。也許在AdjacencyList中存儲unique_ptr並返回索引會更好? – masrtis 2013-04-10 05:55:17