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

ius

所以我有以下功能:

void scan(std::istream& is, Handler& h);

我想用不同的方式来称呼它,例如:

scan(std::cin, Handler());
scan(std::ifstream("myfile"), myhandler);

编译器抱怨std::ifstream("myfile")并将Handler()rvalue作为非const引用传递,因此该抱怨是合法的,但是我该怎么办?

  1. 既不功能参数不能constistream同时读取和处理程序的回调过程中改变其状态被修改)。
  2. 如果我将参数类型更改为右值引用(&&),则将无法通过std::cin,有时我真的很在乎最终状态,myhandler因此我也无法将std::move应用于任何状态。
  3. 原则上,我可以通过模板或auto&&类型推导将参数设置为通用引用,从而对lvalue和rvalue引用的所有可能组合都重载此函数,但是我没有打算针对除我已经指定的其他类型重载此函数。

还有其他选择吗?

在这样一个琐碎的例子中,整个动作的语义都以某种方式被阻碍了。

0x499602D2

要将右值转换为左值,可以使用以下左值辅助函数:

template<class T>
T& lvalue_ref(T&& x) { return x; }

然后该调用变为:

scan(lvalue_ref(std::ifstream("myfile")), lvalue_ref(Handler()));

这是安全的,因为直到完整表达式的结尾都不会破坏临时变量(ifstreamand和Handler)。但是,请注意,这些是对临时变量的左值引用,因此,在决定使用此方法时必须格外小心。我假设在scan()返回后不保留对参数的引用/指针。

例如,不要像这样使用它:

int& x = lvalue_ref(5);
std::cout << x; // temporary is destructed, therefore Undefined Behavior

只要确保返回的引用的生存期与临时生存期相对应,就可以了。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

对引用使用多态。非常量引用的初始化无效

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

`错误:非常量引用的初始化无效` 通过引用传递指针

来自分类Dev

类型为'int&'的非常量引用的初始化无效,这是什么原因?

来自分类Dev

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

来自分类Dev

类型为std :: _ Bit_rerefence&的非常量引用的无效初始化

来自分类Dev

错误:类型'cv :: Mat&'的非常量引用无效的初始化

来自分类Dev

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

来自分类Dev

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

来自分类Dev

初始化右值引用成员

来自分类Dev

使用字符串调用方法时出错:类型'size_t&的非常量引用的无效初始化

来自分类Dev

用右值初始化左值引用

来自分类Dev

用派生的右值引用初始化基

来自分类Dev

右值类型的非常量引用

来自分类Dev

右值类型的非常量引用

来自分类Dev

右值类型的非常量引用

来自分类Dev

C ++使用临时对象右值初始化左值引用以及自动推导

来自分类Dev

为什么不能使用右值来初始化左值引用?

来自分类Dev

错误:非常量静态数据成员必须初始化

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

    对引用使用多态。非常量引用的初始化无效

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

    `错误:非常量引用的初始化无效` 通过引用传递指针

  14. 14

    类型为'int&'的非常量引用的初始化无效,这是什么原因?

  15. 15

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

  16. 16

    类型为std :: _ Bit_rerefence&的非常量引用的无效初始化

  17. 17

    错误:类型'cv :: Mat&'的非常量引用无效的初始化

  18. 18

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

  19. 19

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

  20. 20

    初始化右值引用成员

  21. 21

    使用字符串调用方法时出错:类型'size_t&的非常量引用的无效初始化

  22. 22

    用右值初始化左值引用

  23. 23

    用派生的右值引用初始化基

  24. 24

    右值类型的非常量引用

  25. 25

    右值类型的非常量引用

  26. 26

    右值类型的非常量引用

  27. 27

    C ++使用临时对象右值初始化左值引用以及自动推导

  28. 28

    为什么不能使用右值来初始化左值引用?

  29. 29

    错误:非常量静态数据成员必须初始化

热门标签

归档