首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rvalue函数重载

rvalue函数重载
EN

Stack Overflow用户
提问于 2016-12-17 16:45:43
回答 1查看 146关注 0票数 1

我正在为一个二进制搜索树类实现一个insert函数,该函数有两个版本,一个是用lvalue项调用的(要插入到树中的项),另一个是使用std::move的rvalue。

第一项:

代码语言:javascript
复制
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);
}

第二部分:

代码语言:javascript
复制
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()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-17 23:13:44

首先,考虑一下标准对那些可以移动的对象说了什么:

..。移离对象应置于有效但未指定的状态。

您不能期望它也适用于所有用户定义的类型,但它是一个常见的模式。

让我们假设Comparable是这样的,并分析第二个函数:

代码语言:javascript
复制
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->elementx > t->element都有一个未定义的行为。

换句话说,一旦将对象移出,就不应该使用它。同样,您不应该将同一对象移动两次。

在第二个函数中插入的递归调用是用x调用还是用更高级的std::move(X)调用?

您可以简单地将其重写如下:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41200827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档