Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多个构造函数参数的移动语义_C++_Templates_Move Semantics_Copy And Swap - Fatal编程技术网

C++ 多个构造函数参数的移动语义

C++ 多个构造函数参数的移动语义,c++,templates,move-semantics,copy-and-swap,C++,Templates,Move Semantics,Copy And Swap,对象的构造函数需要用户提供twp参数。要求参数可以是不同的类型,但可以假设每种类型都实现适当的移动语义。(实际示例是一个三次_样条类,它使用数字数据的随机访问对象[向量]构建,一个用于“x”,另一个用于“y”或“f(x)”。) 还要求用户可以传递要被对象复制的参数,或者通过移动语义在不复制的情况下捕获的参数 以下内容适用于VC++std::vector(Dinkumware)和我编写的自定义容器。真的这么简单吗?我认为下面的代码可能是正确的,但我有一些潜在的疑问。我的问题很简单,“这是正确的代码

对象的构造函数需要用户提供twp参数。要求参数可以是不同的类型,但可以假设每种类型都实现适当的移动语义。(实际示例是一个三次_样条类,它使用数字数据的随机访问对象[向量]构建,一个用于“x”,另一个用于“y”或“f(x)”。)

还要求用户可以传递要被对象复制的参数,或者通过移动语义在不复制的情况下捕获的参数

以下内容适用于VC++std::vector(Dinkumware)和我编写的自定义容器。真的这么简单吗?我认为下面的代码可能是正确的,但我有一些潜在的疑问。我的问题很简单,“这是正确的代码吗?”(如果不是,它怎么会失败,应该如何重写?不必要的数据复制将被视为失败。)

#包括
模板
类样条{
公众:
样条曲线(V1,V2)无例外
:xv(标准::移动(v1))
,yv(标准::移动(v2))
{}
私人:
V1-xv;
V2-yv;
};
int main(){
使用dv=std::vector;
使用fv=std::vector;
fv xx{1.f,1.5f,1.7f,2.f};
dvyy{1,-1,1.2,3};
样条sp(xx,std::move(yy));
//xx现在不变,但yy为空,其内容为
//被sp移动。
返回0;
}

这是正确的代码。这就是C++11的优点。有关更多数据,请参阅戴夫·亚伯拉罕的帖子。

你的问题是什么?问题是代码是否正确?是否是性能?是否有人能提出更好的方法?我们是否能猜出你已经知道的“陷阱”?为了清晰起见编辑。我刚刚想到的问题是,初始化是否会像这样更好:样条曲线(v1v1,v2v2)noexcept:xv(std::move(V1)),yv(std::move(V2)){}@JiveDadson,你是对的。这样,您将为每个成员调用move-ctor,而不是默认的ctor+move-oper=。尽管大多数(全部?)现代编译器都能为您解决这个问题并进行优化
#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;
}