Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::move的无限递归_C++_Move_Rvalue_Lvalue - Fatal编程技术网

C++ std::move的无限递归

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 ?

我有一个模仿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 ? 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
那样真正窃取资源。