如何将右值作为引用参数传递给函数

How to pass an rvalue as a reference argument to a function

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

代码如下:

#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");
}

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

error: invalid initialization of non-const reference of type ‘std::unordered_map&’ from an rvalue of type ‘std::unordered_map’

我也尝试了 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");
}

您不想为 std::unordered_map<int, int> 对象编写定义的愿望似乎没有任何合理的顾虑。但是,既然你问的是这个,这里有一个方法可以做到:

using M = std::unordered_map<int, int>;
myFunc(const_cast<M&>(static_cast<const M&>(M())));

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

对于这种情况,我的建议是添加一个 myFunc 重载:

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

然后把你的main改成call

int main() {
  myFunc();
}