2

以下の 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)) {}
};
4

1 に答える 1

5

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 番目のバリアントでは書き込みが少なくなります。したがって、答えは次のとおりです。パフォーマンスを最適化する理由がない限り、後者を使用してください。

于 2014-03-11T19:36:19.190 に答える