将const引用绑定到右值引用

亚当

我在下面有这个私有成员函数,(是类模板的一部分Heap):

template <typename Task, typename Priority>
const size_t& Heap<Task, Priority>::parent_of(const size_t& index) const
{
    // ** warning C4172: returning address of local variable or temporary
    return (this_index-1)/2;
}

我从其他功能调用它,如下所示:

template <typename Task, typename Priority>
void Heap<Task, Priority>::bubble_up(const size_t&   start_index)
{
    ....
    if (priority_of(start_index) > priority_of((parent_of(start_index)))) 
    { 
        ... do work ...
        //call recursively the bubble_up
        bubble_up(parent_of(start_index));
    }
    ...
}

问题是,priority_of函数参数index被损坏或在第二次递归调用中释放:

template <typename Task, typename Priority>
const Priority& Heap<Task, Priority>::priority_of(const size_t& index) const
{
    return vec.at(index).second;
}

现在,VS警告我,我将在函数中返回局部变量或临时(右值)的地址parent_of,这在最后是合理的,因为当控件存在/从parent_of所有局部变量(包括释放的函数参数)返回时,这种行为是有道理的

现在,当将函数更改为parent_of按值返回(而不是通过const ref)时,事情就开始起作用了!

我来自C ++ 98,(因此我不太清楚所有右值引用)的问题是:何时以及如何使用右值引用(&&)来克服这个问题?我可以引用(包括更改其值)编译器分配的该temp对象并返回对其的引用(用作返回值)吗?

慈济

如果要根据返回表达式的值类别保留返回值的生存期语义,则不能返回const&,甚至不能返回a &&因为您将遇到悬挂引用的问题。

相反,您可以将其decltype(auto)用于返回类型,以便推断出返回表达式的适当值类别:

template <typename Task, typename Priority>
decltype(auto) Heap<Task, Priority>::priority_of(const size_t& index) const
{
    decltype(auto) result = vec.at(index).second;
    return decltype(result)(result);
}

现在,返回类型将推断出正确的值类别,即,用于l值引用的l值,用于pr值(临时)的r值和x值(过期值)。

演员要decltype(result)在返回语句用来表达转换为基于由ID表达命名实体的类型选择合适的类型result

您需要对要保留生命周期语义的调用堆栈中的所有函数使用此技术。

您可以将这种技术视为完美转发,但是却是相反的方向,即向上调用堆栈而不是向下调用。

该答案基于此有趣的闪电演讲中描述的技术

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

const引用如何绑定到右值

来自分类Dev

为什么我可以在C ++中使用for循环将右值绑定到非const引用?

来自分类Dev

返回语句将右值引用绑定到左值?

来自分类Dev

将右值绑定到左值引用

来自分类Dev

左值到右值引用绑定

来自分类Dev

左值到右值引用绑定

来自分类Dev

为什么不允许将右值引用绑定到非const引用,但是却可以在一个对象上调用非const成员函数

来自分类Dev

为什么可以将右值间接绑定到左值引用,而不能直接绑定呢?

来自分类Dev

将临时右值绑定到std :: vector构造函数中的引用左值

来自分类Dev

std :: async使用绑定到lambda的右值引用

来自分类Dev

通过将返回值绑定到const引用来提高C ++性能

来自分类Dev

为什么右值引用可以绑定到非引用类型

来自分类Dev

引用const char的右值的重载解析*

来自分类Dev

右值引用可以作为const引用传递吗?

来自分类Dev

具有c ++ 11标志的clang ++显示右值引用无法绑定到左值错误

来自分类Dev

为什么C ++左值对象不能绑定到右值引用(&&)?

来自分类Dev

具有c ++ 11标志的clang ++显示右值引用无法绑定到左值错误

来自分类Dev

为什么此代码给出错误“无法将类型'char *&'的非常量左值引用绑定到类型为'char *'的右值”

来自分类Dev

右值引用引用的内存

来自分类Dev

将引用(右值)移动到函数

来自分类Dev

为什么添加const将通用引用作为右值

来自分类Dev

绑定到参数和返回值const引用的C ++临时对象

来自分类Dev

将临时作为const T&传递并绑定到类引用的副作用

来自分类Dev

命名右值引用

来自分类Dev

返回右值引用

来自分类Dev

销毁右值引用

来自分类Dev

为什么临时对象可以绑定到 const 引用?

来自分类Dev

左值引用绑定

来自分类Dev

关于将const引用绑定到临时对象的子对象

Related 相关文章

  1. 1

    const引用如何绑定到右值

  2. 2

    为什么我可以在C ++中使用for循环将右值绑定到非const引用?

  3. 3

    返回语句将右值引用绑定到左值?

  4. 4

    将右值绑定到左值引用

  5. 5

    左值到右值引用绑定

  6. 6

    左值到右值引用绑定

  7. 7

    为什么不允许将右值引用绑定到非const引用,但是却可以在一个对象上调用非const成员函数

  8. 8

    为什么可以将右值间接绑定到左值引用,而不能直接绑定呢?

  9. 9

    将临时右值绑定到std :: vector构造函数中的引用左值

  10. 10

    std :: async使用绑定到lambda的右值引用

  11. 11

    通过将返回值绑定到const引用来提高C ++性能

  12. 12

    为什么右值引用可以绑定到非引用类型

  13. 13

    引用const char的右值的重载解析*

  14. 14

    右值引用可以作为const引用传递吗?

  15. 15

    具有c ++ 11标志的clang ++显示右值引用无法绑定到左值错误

  16. 16

    为什么C ++左值对象不能绑定到右值引用(&&)?

  17. 17

    具有c ++ 11标志的clang ++显示右值引用无法绑定到左值错误

  18. 18

    为什么此代码给出错误“无法将类型'char *&'的非常量左值引用绑定到类型为'char *'的右值”

  19. 19

    右值引用引用的内存

  20. 20

    将引用(右值)移动到函数

  21. 21

    为什么添加const将通用引用作为右值

  22. 22

    绑定到参数和返回值const引用的C ++临时对象

  23. 23

    将临时作为const T&传递并绑定到类引用的副作用

  24. 24

    命名右值引用

  25. 25

    返回右值引用

  26. 26

    销毁右值引用

  27. 27

    为什么临时对象可以绑定到 const 引用?

  28. 28

    左值引用绑定

  29. 29

    关于将const引用绑定到临时对象的子对象

热门标签

归档