【问题标题】:Move semantics for a plurality of constructor parameters多个构造函数参数的移动语义
【发布时间】:2018-05-08 23:17:30
【问题描述】:

对象的构造函数需要来自用户的 twp 参数。要求参数可以是不同的类型,但可以假定每种类型都实现正确的移动语义。 (实际示例是一个cubic_spline 类,它是使用数字数据的随机访问对象[向量] 构造的,一个用于“x”,另一个用于“y”或“f(x)”。) /p>

进一步要求用户可以传递任一参数以由对象复制,或通过移动语义在不复制的情况下捕获。

以下内容适用于 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;
}

【问题讨论】:

  • 您的问题是什么?问题是代码是否正确?是否是性能?是否有人可以提出更好的方法?我们能不能猜出你已经知道的“陷阱”?
  • 为清晰起见进行了编辑。

标签: c++ templates move-semantics copy-and-swap


【解决方案1】:

这是正确的代码。这就是 C++11 的美妙之处。如需更多数据,请参阅 Dave Abrahams 的帖子Want speed? Pass by value

【讨论】:

  • 我刚刚想到的问题是初始化是否会更好: spline(V1 v1, V2 v2) noexcept : xv( std::move(v1)) , yv( std::move (v2)) {}
  • @JiveDadson,你是对的。这样,您将为每个成员调用 move ctor,而不是默认 ctor + move oper=。尽管大多数(全部?)现代编译器都能够解决这个问题并为您优化
猜你喜欢
  • 2015-11-19
  • 2013-11-05
  • 2021-12-03
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
相关资源
最近更新 更多