Семантика перемещения для множества параметров конструктора

Конструктор объекта требует аргументов twp от пользователя. Требуется, чтобы параметры могли быть разных типов, но можно предположить, что каждый тип реализует правильную семантику перемещения. (Настоящим примером является класс cube_spline, созданный с использованием объектов произвольного доступа [векторов] числовых данных, один для «x», другой для «y» или «f(x)».)

Кроме того, требуется, чтобы пользователь мог передать любой параметр либо для копирования объектом, либо для захвата без копирования с помощью семантики перемещения.

Следующее работает как для VC++ std::vector (Dinkumware), так и для пользовательского контейнера, который я написал. Это действительно так просто? Я думаю, что приведенный ниже код, вероятно, правильный, но у меня есть скрытые сомнения. У меня простой вопрос: "Правильный ли это код?" (А если нет, то как он может выйти из строя и как его переписать? считать неудачным)

#include <vector>

template<class V1, class V2>
class spline {
public:

    spline(V1 v1, V2 v2)  noexcept
    : xv( std::move(v1))
    , yv( std::move(v2))
    {}

private:
    V1 xv;
    V2 yv;
};


int main() {

    using dv = std::vector<double>;
    using fv = std::vector<float>;

    fv xx { 1.f, 1.5f, 1.7f, 2.f};
    dv yy { 1, -1, 1.2, 3};
    spline<fv, dv> sp(xx, std::move(yy));
    // xx is now unchanged, but yy is empty, its contents
    // having been moved by sp.
    return 0;
}

person Jive Dadson    schedule 25.11.2017    source источник
comment
Какой у Вас вопрос? Вопрос в правильности кода? Является ли это производительностью? Может ли кто-нибудь предложить лучший способ? Можем ли мы угадать подводный камень, который вы уже знаете?   -  person John Zwinck    schedule 25.11.2017
comment
Отредактировано для ясности.   -  person Jive Dadson    schedule 25.11.2017


Ответы (1)


Это правильный код. В этом прелесть C++11. Дополнительные данные см. в сообщении Дэйва Абрахамса Хотите скорость? Передать по значению.

person Innocent Bystander    schedule 25.11.2017
comment
У меня только что возник вопрос, будет ли инициализация лучше: spline(V1 v1, V2 v2) noexcept : xv( std::move(v1)) , yv( std::move(v2)) {} - person Jive Dadson; 25.11.2017
comment
@JiveDadson, ты прав. Таким образом, вы будете вызывать перемещение ctor для каждого члена вместо стандартного ctor + move oper=. Хотя большинство (все?) современных компиляторов смогут понять это и оптимизировать для вас - person Innocent Bystander; 25.11.2017