在一个简单的可复制结构中,应该实现移动语义吗?

时间:2018-06-08 11:21:22

标签: c++ c++11 templates c++14 move-semantics

我有这样的结构:

template <class T> struct Dimensions
{
    T horizontal{}, vertical{};

    Dimensions() = default;
    Dimensions(const T& horizontal, const T& vertical)
        : horizontal(horizontal), vertical(vertical) {}
    Dimensions(const Dimensions& other) = default;
    Dimensions& operator=(const Dimensions& other) = default;
    Dimensions(Dimensions&& other) = default; // ?
    Dimensions& operator=(Dimensions&& other) = default; // ?
    ~Dimensions() = default;

    // ... + - * / += -= *= areNull() ...

}

我实例化Dimensions<int>Dimensions<double>。由于它是trivially copyable,这里最好的策略是什么,生成移动构造函数并将赋值运算符移动为= default或者避免= delete的隐式运算符?

1 个答案:

答案 0 :(得分:4)

  

生成移动构造函数并将赋值运算符移动为= default或通过= delete避免隐式运算符?

前者,除非您希望任何尝试std::move类型的代码无法编译。 E.g。

template <typename T>
void foo()
{
    T a;
    T b = std::move(a);
}

struct X
{
    X() = default;
    X(X&&) = delete;
};

int main() { foo<X>(); }

live example on wandbox.org