如何将rvalue作为参考参数传递给函数

时间:2018-03-30 21:23:02

标签: c++ c++11 parameter-passing pass-by-reference rvalue

我有一个接受对象引用的函数。在一个特定的调用实例中,我并不关心函数如何处理特定对象。因此,我希望我能避免在主函数中创建该对象。

代码如下:

#include <stdio.h>
#include <unordered_map>

void myFunc(std::unordered_map<int,int> &mp);

int main() {
  myFunc(std::unordered_map<int,int>());
  return 0;
}

void myFunc(std::unordered_map<int,int> &mp) {
  printf("%d\n",mp.size());
  printf("Hello world.\n");
}

底线是:我不想在main函数中声明和初始化unordered_map<int,int>对象。此版本的代码报告:

  

错误:从'std :: unordered_map'类型的右值开始无效初始化'std :: unordered_map&amp;'类型的非const引用

我也尝试了const_cast<>std::move,但都没有效果。

如果我们将API更改为:

,则可以删除错误
void myFunc(std::unordered_map<int,int> &&mp)

问题是API在多个文件之间共享,我们真的不想更改它。鉴于必须修复myFunc的API,如何修改main()以便我不需要显式创建对象?

--------------------------编辑-------------------- ----

另一种解决方法是编写包装函数:

#include <stdio.h>
#include <unordered_map>

void myFunc(std::unordered_map<int,int> &mp);
void UglyWorkAround(std::unordered_map<int,int> &&mp);

int main() {
  UglyWorkAround(std::unordered_map<int,int>());
  return 0;
}

void UglyWorkAround(std::unordered_map<int,int> &&mp) {
  myFunc(mp);
}

void myFunc(std::unordered_map<int,int> &mp) {
  printf("%d\n",mp.size());
  printf("Hello world.\n");
}

2 个答案:

答案 0 :(得分:2)

您希望避免为$response_a['rows'][0]['elements'][0]['status'] 对象编写定义似乎并不基于任何合理的问题。但是,既然你问的是,这是一种方法:

std::unordered_map<int, int>

答案 1 :(得分:1)

如评论中所述,C ++不允许您为非const左值引用传递临时值。您提出的带右值参考的解决方案会破坏您的其他用途。

我建议的这种情况(根据您的实际使用可能无效)将添加myFunc重载:

void myFunc() {
  std::unordered_map<int,int> m{};
  myFunc(m);
}

然后将主要内容更改为

int main() {
  myFunc();
}