功能超载rvalue
Function overloading for rvalue
我正在为二进制搜索树类实现 insert
函数,有两个版本用于该函数,一个用lvalue项目称为lvalue项目(要插入到树上的项目)一个带有我使用std::move
的rvalue。
第一个:
template <typename Comparable>
void BinarySearchTree<Comparable>::insert(const Comparable &x, BinaryNode* &t)
{
if (t == nullptr)
t = new BinaryNode(x, nullptr, nullptr);
if (x < t->element)
insert(x, t->left);
if (x > t->element)
insert(x, t->right);
}
第二个:
template <typename Comparable>
void BinarySearchTree<Comparable>::insert(Comparable &&x, BinaryNode* &t)
{
if (t == nullptr)
t = new BinaryNode(std::move(x), nullptr, nullptr);
if (x < t->element)
insert(x, t->left); // should this be insert(std::move(x), t->left)?
if (x > t->element)
insert(x, t->right); // also here?
}
第二个功能中insert
的递归调用是否应使用x
或std::move(x)
?
我的猜测是它应该是 x
,因为它已经是一个rvalue,并且不需要 move()
,但是,指南实现我正在使用二手std::move()
首先,请考虑标准对那些可以移动的对象说的内容:
[...]将移动的对象放置在有效但未指定的状态中。
您不能期望它也适用于所有用户定义的类型,但这是一个常见的模式。
让我们假设Comparable
是这种情况,并分析您的第二个功能:
template <typename Comparable>
void BinarySearchTree<Comparable>::insert(Comparable &&x, BinaryNode* &t)
{
if (t == nullptr)
t = new BinaryNode(std::move(x), nullptr, nullptr);
if (x < t->element)
insert(x, t->left); // should this be insert(std::move(x), t->left)?
if (x > t->element)
insert(x, t->right); // also here?
}
如果t
等于nullptr
,则在t
中移动x
。
该操作之后,x
在有效但未指定的状态中可能会发生。
这意味着x < t->element
以及x > t->element
具有不确定的行为。
换句话说,一旦将其移出后,您就不应使用对象。同样,您也不应移动两次相同的对象。
是否应使用X或STD :: Move(x)?
在第二个功能中插入的递归调用
您可以简单地将其重写:
template <typename Comparable>
void BinarySearchTree<Comparable>::insert(Comparable &&x, BinaryNode* &t)
{
if (t == nullptr) {
t = new BinaryNode(std::move(x), nullptr, nullptr);
} else if (x < t->element) {
insert(std::move(x), t->left);
} else if (x > t->element) {
insert(std::move(x), t->right);
}
}
仅移动Comparable
一次。
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 寻找地理和伤害意味着超载
- 没有可行的超载'='用于shared_ptr
- "专业化不参与超载"
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 虚拟超载运算符>>和<<
- 为什么我的超载"+"运算符返回的总额错误?
- C++ 超载 += 用于两个袋子的合并,返回类型为空隙
- 如果没有带有函数签名的 rvalue 参数,是否会执行 C++ 11 中的移动语义?
- 警告:返回对临时 - 奇怪情况的引用(对 Rvalue 的澄清)
- C++11 中对超载'ref(Select::Expressions::Code&)'的调用模棱两可
- C++标准是否保证失败的插入到关联容器中不会修改 rvalue-reference 参数?
- 为什么STD :: SPAN超载函数调用操作员索引
- C 操作员超载调用驱动器
- C const char *评估操作员超载
- 如何包括C 模板类的非成员运算符 - 超载
- 类型长的长度和未解决的超载函数类型的类型的操作数与二进制运算符
- 无法调用纯抽象基类超载
- rvalue参数无法解析功能超载
- 功能超载rvalue