以下の 2 つのうちどちらを優先する必要がありますか。また、その理由は何ですか?
struct X {
Y data_;
explicit X(Y&& data): data_(std::forward<Y>(data)) {}
};
対
struct X {
Y data_;
explicit X(Y data): data_(std::move(data)) {}
};
以下の 2 つのうちどちらを優先する必要がありますか。また、その理由は何ですか?
struct X {
Y data_;
explicit X(Y&& data): data_(std::forward<Y>(data)) {}
};
対
struct X {
Y data_;
explicit X(Y data): data_(std::move(data)) {}
};
2 つのバリアントは機能が異なります。次のステートメントは、2 番目のステートメントでは機能しますが、最初のステートメントでは機能しません。
Y y;
X x(y);
同じ機能を探している場合、2 つのバリアントは次のようになります。
struct X
{
Y data_;
explicit X(const Y& data) : data_(data) { }
explicit X(Y&& data) : data_(std::move(data)) { }
};
struct X
{
Y data_;
explicit X(Y data) : data_(std::move(data)) { }
};
最初のバリアントでは移動操作が1 回節約されますが、2 番目のバリアントでは書き込みが少なくなります。したがって、答えは次のとおりです。パフォーマンスを最適化する理由がない限り、後者を使用してください。