假設我們有一個函數期望按值分享指針。 (在實際生活中的例子我把它由右值參考,並將其轉發到一個成員。)std :: move into static_pointer_cast:爲什麼static_pointer_cast沒有右值引用超載?
void f(std::shared_ptr<Derived> ptr) { ... }
但我們只具有共用的指針的基類,所以我們使用static_pointer_cast
:
std::shared_ptr<Base> ptr = std::make_shared<Derived>();
f(std::static_pointer_cast<Derived>(ptr));
第一次賦值(從臨時構造ptr)是否觸發引用計數的原子增量和減量,或者共享指針是否被移動? (請注意,它正在上傳。)
在static_pointer_cast
內有一個引用計數的原子增量。如果我們不再需要ptr
,我們希望將它移動到f
。但是,因爲有服用右值引用沒有static_pointer_cast
過載,此舉將不會有任何效果:
f(std::static_pointer_cast<Derived>(std::move(ptr)));
我們還是儘快ptr
被破壞有單位遞增和相應的原子遞減。爲什麼沒有這種超載?
推測:這裏列出的「可能的實現」:http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast都使用'shared_ptr'的構造函數,它不接受移動的參數。現在爲什麼*沒有我無法告訴你的移動變化。 – vu1p3n0x
你不能移動static_pointer_cast的結果嗎? – rubenvb
@rubenvb static_pointer_cast的結果是臨時的,因此是一個右值,所以它會自動移動。但問題是你顯然無法進入static_pointer_cast。 – Creep4Play