多个构造函数参数的移动语义
Move semantics for a plurality of constructor parameters
对象的构造函数需要来自用户的 twp 参数。要求参数可以是不同类型,但可以假设每种类型都实现适当的移动语义。 (实际示例是 cubic_spline class,它是使用数值数据的随机访问对象 [向量] 构建的,一个用于 "x's",另一个用于 "y's"或 "f(x)'s".)
进一步要求用户可以传递任何一个参数,要么由对象复制,要么通过移动语义捕获而不复制。
以下内容适用于 VC++ std::vector (Dinkumware) 和我编写的自定义容器。真的这么简单吗?我认为下面的代码可能是正确的,但我暗暗怀疑。我的问题很简单,"Is this correct code?"(如果没有,它怎么会失败,应该如何重写?不必要的复制的数据将被视为失败。)
#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;
}
这是正确的代码。这就是 C++11 的美妙之处。有关更多数据,请参阅 Dave Abrahams 的 post Want speed? Pass by value.
对象的构造函数需要来自用户的 twp 参数。要求参数可以是不同类型,但可以假设每种类型都实现适当的移动语义。 (实际示例是 cubic_spline class,它是使用数值数据的随机访问对象 [向量] 构建的,一个用于 "x's",另一个用于 "y's"或 "f(x)'s".)
进一步要求用户可以传递任何一个参数,要么由对象复制,要么通过移动语义捕获而不复制。
以下内容适用于 VC++ std::vector (Dinkumware) 和我编写的自定义容器。真的这么简单吗?我认为下面的代码可能是正确的,但我暗暗怀疑。我的问题很简单,"Is this correct code?"(如果没有,它怎么会失败,应该如何重写?不必要的复制的数据将被视为失败。)
#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;
}
这是正确的代码。这就是 C++11 的美妙之处。有关更多数据,请参阅 Dave Abrahams 的 post Want speed? Pass by value.