我应该实现右值推送功能吗?我应该使用std::move吗

Should I implement rvalue push function and should I use std::move?

本文关键字:我应该 std move 功能 实现      更新时间:2023-10-16

作为练习,我正在C++11中实现一个堆栈类。
这是相关的代码:

template <class T>
class stack
{
private:
T * elements;
std::size_t capacity;
std::size_t count;
public:
explicit stack(std::size_t capacity) : capacity(capacity)
{
elements = new T[capacity];
};
~stack()
{
delete[] elements;
};
void push(const T & t)
{
if (capacity > count)
{
elements[count++] = t;
}
}
void push(T && t)
{
if (capacity > count)
{
elements[count++] = std::move(t);
}
}
};

我使用的类如下:

stack<std::string> stack_test(2);
stack_test.push("string1");
std::string string2 = "string2";
stack_test.push(string2);

正如预期的那样,第一次推送使用推送(T&&T(,而第二次推送则使用push(const T&T(

我是否应该执行右值推送(即是否需要执行推送(T&&T((
我应该在其中使用std::move((吗?

假设在两个push中都存储t,则可以有一个

void push(T t)
{
if (capacity > count)
{
elements[count++] = std::move(t);
}
}

但实际上,您应该使用std::vector<T> elements;(或std::deque/std::list(,就像std::stack如何进行一样