这些是Same函数的定义,但第一个是使用move(&&)
传递参数,第二个是使用(const &
)传递的。
template<typename T, class Allocator>
void MyList<T, Allocator>::push_front(T && t)
{
Link<T>* newnode = new Link<T>(t);
if (empty()) {
head = std::move(newnode);
tail = std::move(newnode);
std::cout << "Linked List Created using move with value: " <<t<< std::endl;
}
else {
head->prev = std::move(newnode);
newnode->next = std::move(head);
head = std::move(newnode);
std::cout << "Node Inserted using move at the beginning of List with value: " <<t<< std::endl;
}
}
template<typename T, class Allocator>
void MyList<T, Allocator>::push_front(const T & t)
{ Link<T>* newnode = new Link<T>(t);
if (empty()) {
head = newnode;
tail = newnode;
std::cout << "Linked List Created with value: " <<t<< std::endl;
}
else {
head->prev = newnode;
newnode->next = head;
head = newnode;
std::cout << "Node Inserted at the beginning of List with value: " <<t<< std::endl;
}
}
当我在main中运行以下代码时:
MyList<int> l1;
l1.push_front(5);
l1.push_front(std::move(8));
我总是得到cout
函数的move
。 const &
不应该是默认的吗?
答案 0 :(得分:1)
5
本身就是一个右值。它是一个仅用于push_front
的临时值,因此编译器可以安全地进行&&
调用。要查看预期的行为,请尝试左值:
MyList<int> l1;
int foo = 5;
l1.push_front(foo);
l1.push_front(std::move(foo));
编译器无法确定您在第一次通话后未能使用foo
,因此必须致电const &
。