考慮我有一個容器std::map<int, std::shared_ptr<MyClass>>
,我想填充它的外部功能,並避免處理其內容。所以我有如何正確處理移動構造函數的shared_ptr映射?
typedef Container std::map<int, std::shared_ptr<MyClass>>
Container&& f(){
Container bar;
auto foo = std::shared_ptr<MyClass>(new MyClass());
bar.insert(std::make_pair(0,foo));
std::cout<<bar.at(1)->print_smth<<'\n'; //This works
return std::move(bar);
}
int main(){
Container baz(f());
std::cout<<bar.at(1)->print_smth<<'\n'; //This doesn't
// Container baz has element 1, but shared_ptr is invalidated, because it has 0 references.
}
如果我使用傳統的複製構造函數,一切都按預期工作。
返回值已經是一個右值,並且極有可能沒有因RVO而做的副本。 – Cubic
您不得返回對本地自動對象的引用。訪問該引用的行爲是未定義的。 –
@Cubic在實踐中使用現代編譯器優化啓用你是正確的,但我stiil不明白我做錯了什麼。 – galadog