std::move 的无限递归
Infinite recursion with std::move
我有一个模仿 std::vector 的 class。
为此,我想要一个接受左值和右值的函数 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 的文档说
It is exactly equivalent to a static_cast to an rvalue reference type.
我错过了什么?
问题是,在
void push_back(const T& obj) {
push_back(std::move(obj));
}
你用 std::move
获得了 const T&&
。
所以唯一可行的候选者是void push_back(const T&)
,所以无限递归调用。
我有一个模仿 std::vector 的 class。 为此,我想要一个接受左值和右值的函数 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 的文档说
It is exactly equivalent to a static_cast to an rvalue reference type.
我错过了什么?
问题是,在
void push_back(const T& obj) {
push_back(std::move(obj));
}
你用 std::move
获得了 const T&&
。
所以唯一可行的候选者是void push_back(const T&)
,所以无限递归调用。