Аргумент конструктора C ++ 11: std :: move и value или std :: forward и ссылка на rvalue

Какой из приведенных ниже двух предпочтительнее и почему?

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

Решение

Два варианта отличаются по функциональности. Следующие утверждения работают для второго, но не для первого:

Y y;
X x(y);

Если вы ищете одинаковую функциональность, оба варианта должны выглядеть следующим образом:

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)) { }
};

Первый вариант сохраняет один переехать операция, тогда как второй вариант меньше писать. Итак, ответ таков: используйте последний, если у вас нет причин для оптимизации производительности.

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector