【发布时间】:2020-02-21 11:40:43
【问题描述】:
作为练习,我正在用 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);
正如预期的那样,第一次推送使用push(T && t),而第二次推送使用push(const T & t)。
我是否应该实现右值推送(即是否需要实现 push(T && t))?
我应该在其中使用 std::move() 吗?
【问题讨论】:
-
你已经实现了右值和左值推送,
rvalue push是什么意思? -
我认为你已经很好地完成了这两个重载。
-
@ConstantinosGlynos 第一次推送会创建一个临时移动,该移动在
void push(T && t)函数中分配。第二个推送副本分配在void push(const T & t)。两者看起来都不错。 -
我不确定如何解释这两个问题。 “我应该实现右值推送吗?” - 你已经做到了。 “我应该在其中使用 std::move() 吗?” - 是的,否则它会像第一次重载一样被复制分配。
-
初始化计数=0;内部构造函数。我检查了你的代码,右值函数实现正确,在里面你可以在移动操作后检查 t 是否为空。
标签: c++ c++11 move-semantics rvalue-reference