右值类型的非常量引用

塔120

考虑以下代码:

class Widget{};

template<typename T>
T &&foo2(T &&t){
    return std::forward<T>( t );
}

/// Return 1st element
template<typename T>
typename std::tuple_element<0, typename std::decay<T>::type >::type  &&foo(T &&t){
    return std::forward< typename std::tuple_element<0, typename std::decay<T>::type >::type >
            ( std::get<0>(t) );
}

Widget w;
auto list = std::make_tuple(
    w,
    Widget()
);


int main()
{
  auto &l  = foo(list );                      // This is NOT work
  //auto &l2 = foo2( std::get<0>(list) );     // This one works.
}

http://coliru.stacked-crooked.com/a/4d3b74ca6f043e45

当我尝试对此进行编译时,出现以下错误:

error: invalid initialization of non-const reference of type 'Widget&' from an rvalue of type 'std::tuple_element<0ul, std::tuple<Widget, Widget> >::type {aka Widget}'

好吧,那没关系,但是:

  • 首先,小部件w不是临时的。为什么把它当作临时的呢?

  • 第二,为什么foo2比呢?

PS如您所见,我尝试编写可同时使用左值和右值的函数。如果第一个元素是临时元素,我想返回右值,如果不是-左值。

恶魔

tuple_element 返回元素类型,而不是引用类型(除非元素类型本身是引用类型)。

如果类型T引用类型,则需要让它返回引用类型。

这可以用条件表示:

typename std::conditional<std::is_lvalue_reference<T>::value,
    typename std::add_lvalue_reference<
        typename std::tuple_element<0, typename std::decay<T>::type >::type>::type,
    typename std::tuple_element<0, typename std::decay<T>::type >::type>::type

或者,更容易使用decltype,因为std::get已经为您执行了此计算:

decltype(std::get<0>(std::declval<T &&>())) &&

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

右值类型的非常量引用

来自分类Dev

右值类型的非常量引用

来自分类Dev

从类型''的右值对类型''的非常量引用进行了无效的初始化

来自分类Dev

从右值无效初始化非常量引用

来自分类Dev

从右值无效初始化非常量引用

来自分类Dev

C ++:右值引用转换为非常量左值引用

来自分类Dev

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

来自分类常见问题

非常量左值引用

来自分类Dev

错误:从类型'std :: vector <bool> :: reference {aka std :: _ Bit_reference}'的右值初始化'bool&'类型的非常量引用无效

来自分类Dev

从Visual C ++ 2015中的右值无效初始化非常量引用

来自分类Dev

将右值参数传递给非常量左值引用的参数

来自分类Dev

在C ++ 03中是否可以使用非常量右值引用?

来自分类Dev

从Visual C ++ 2015中的右值无效初始化非常量引用

来自分类Dev

我想将非常量左值引用绑定到类型T的临时类型T

来自分类Dev

通过引用,常量引用,右值引用还是常量右值引用传递?

来自分类Dev

为什么通过右值初始化非常量引用有效(在C ++ 11中)?

来自分类Dev

为什么通过右值初始化非常量引用有效(在C ++ 11中)?

来自分类Dev

如何处理对类型“A”的非常量左值引用无法绑定到此指针的无关类型“B”的值?

来自分类Dev

C ++-类型的非常量引用的无效初始化

来自分类Dev

类型的非常量引用的无效初始化

来自分类Dev

类型的非常量引用的无效初始化错误

来自分类Dev

类型的非常量引用的无效初始化中的错误

来自分类Dev

右值引用中的类型更改

来自分类Dev

从“ int *”类型的临时类型无效初始化“ int&”类型的非常量引用

来自分类Dev

c ++:“类型为“列表*”的临时类型的类型为“列表&”的非常量引用无效的初始化”

来自分类Dev

右值引用与常量左值引用的C ++模板参数推导

来自分类Dev

模板中右值引用和常量左值引用之间的重载

来自分类Dev

来自 const char* 类型的临时对象的 cost char*& 类型的非常量引用的无效初始化

来自分类Dev

通过值,常量值,引用或常量引用传递非POD类型

Related 相关文章

  1. 1

    右值类型的非常量引用

  2. 2

    右值类型的非常量引用

  3. 3

    从类型''的右值对类型''的非常量引用进行了无效的初始化

  4. 4

    从右值无效初始化非常量引用

  5. 5

    从右值无效初始化非常量引用

  6. 6

    C ++:右值引用转换为非常量左值引用

  7. 7

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

  8. 8

    非常量左值引用

  9. 9

    错误:从类型'std :: vector <bool> :: reference {aka std :: _ Bit_reference}'的右值初始化'bool&'类型的非常量引用无效

  10. 10

    从Visual C ++ 2015中的右值无效初始化非常量引用

  11. 11

    将右值参数传递给非常量左值引用的参数

  12. 12

    在C ++ 03中是否可以使用非常量右值引用?

  13. 13

    从Visual C ++ 2015中的右值无效初始化非常量引用

  14. 14

    我想将非常量左值引用绑定到类型T的临时类型T

  15. 15

    通过引用,常量引用,右值引用还是常量右值引用传递?

  16. 16

    为什么通过右值初始化非常量引用有效(在C ++ 11中)?

  17. 17

    为什么通过右值初始化非常量引用有效(在C ++ 11中)?

  18. 18

    如何处理对类型“A”的非常量左值引用无法绑定到此指针的无关类型“B”的值?

  19. 19

    C ++-类型的非常量引用的无效初始化

  20. 20

    类型的非常量引用的无效初始化

  21. 21

    类型的非常量引用的无效初始化错误

  22. 22

    类型的非常量引用的无效初始化中的错误

  23. 23

    右值引用中的类型更改

  24. 24

    从“ int *”类型的临时类型无效初始化“ int&”类型的非常量引用

  25. 25

    c ++:“类型为“列表*”的临时类型的类型为“列表&”的非常量引用无效的初始化”

  26. 26

    右值引用与常量左值引用的C ++模板参数推导

  27. 27

    模板中右值引用和常量左值引用之间的重载

  28. 28

    来自 const char* 类型的临时对象的 cost char*& 类型的非常量引用的无效初始化

  29. 29

    通过值,常量值,引用或常量引用传递非POD类型

热门标签

归档