xem xét:Tôi nên std :: di chuyển một shared_ptr trong một nhà xây dựng di chuyển?
#include <cstdlib>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
class Gizmo
{
public:
Gizmo() : foo_(shared_ptr<string>(new string("bar"))) {};
Gizmo(Gizmo&& rhs); // Implemented Below
private:
shared_ptr<string> foo_;
};
/*
// doesn't use std::move
Gizmo::Gizmo(Gizmo&& rhs)
: foo_(rhs.foo_)
{
}
*/
// Does use std::move
Gizmo::Gizmo(Gizmo&& rhs)
: foo_(std::move(rhs.foo_))
{
}
int main()
{
typedef vector<Gizmo> Gizmos;
Gizmos gizmos;
generate_n(back_inserter(gizmos), 10000, []() -> Gizmo
{
Gizmo ret;
return ret;
});
random_shuffle(gizmos.begin(), gizmos.end());
}
Trong đoạn mã trên, có hai phiên bản của Gizmo::Gizmo(Gizmo&&)
- một sử dụng std::move
để thực sự di chuyển các shared_ptr
, và người kia chỉ sao chép shared_ptr
.
Cả hai phiên bản dường như hoạt động trên bề mặt. Một khác biệt (khác biệt duy nhất tôi có thể thấy) là trong phiên bản không move
số tham chiếu của shared_ptr
tạm thời tăng lên, nhưng chỉ một thời gian ngắn.
Tôi thường tiếp tục và move
shared_ptr
, nhưng chỉ để rõ ràng và nhất quán trong mã của tôi. Tôi có thiếu cân nhắc ở đây không? Tôi có nên sử dụng phiên bản này so với phiên bản khác vì bất kỳ lý do kỹ thuật nào kỹ thuật không?
Di chuyển trong một hàm tạo di chuyển ít nhất là phù hợp ngữ nghĩa ... – ildjarn
Tại sao bạn giữ chuỗi trong shared_ptr? Một shared_ptr như là một biến thành viên thường xuyên nhất là một dấu hiệu của thiết kế xấu. –
Di chuyển trong một hàm tạo di chuyển phù hợp với những gì mà trình biên dịch sẽ tự động tạo ra. –