C++ std::move的无限递归
我有一个模仿std::vector的类。 为此,我想让一个函数push_back同时接受左值和右值C++ std::move的无限递归,c++,move,rvalue,lvalue,C++,Move,Rvalue,Lvalue,我有一个模仿std::vector的类。 为此,我想让一个函数push_back同时接受左值和右值 void push_back(const T& obj) { push_back(std::move(obj)); } void push_back(T&& obj) { buffer[numElements] = obj; numElements = numElements+1>=Sz-1 ?
void push_back(const T& obj) {
push_back(std::move(obj));
}
void push_back(T&& obj) {
buffer[numElements] = obj;
numElements = numElements+1>=Sz-1 ? Sz-1 : numElements+1;
}
但是,当我由于移动而传递左值时,此代码以无休止的递归结束,它调用了错误的函数(我希望const T&obj
函数调用T&obj
重载)
std::move的文档说
它完全等同于对右值引用类型的静态_转换
我遗漏了什么?问题是
void push_back(const T& obj) {
push_back(std::move(obj));
}
您可以使用std::move
获得const T&
所以唯一可行的候选方法是
void push_back(const T&)
,所以无限递归调用。没有好的方法使用另一个重载实现其中一个重载。第一个需要做buffer[numElements]=obj
,第二个需要执行缓冲区[numElements]=std::move(obj)代码>缓冲区[numElements]=obj代码>应该是缓冲区[numElements]=std::move(obj)
(否则只需执行单个push_back(const T&)
;-)。@Raildex减少重复很好,但在这种情况下,您无法通过基于另一个重载实现其中一个重载。您的选项是:改为使用单个模板函数(带有转发引用参数,类似于下面的注释所示的emplace\U back
),或者将重复的代码移动到其他隐藏函数。您仍然可以转发到template void push\U back\U impl(U&&)
避免duplication@Raildex是否可以传递某些内容仅取决于参数类型,而不取决于在函数体中对其执行的操作。如果没有std::move
,第二个重载将复制参数(而不是移动它,这会更有意义)。好的。非常感谢。将T和&obj
转换为const T和&obj
使其工作!拥有void push_-back(const T&&obj)
重载几乎是毫无意义的,因为你不能像const
那样真正窃取资源。