我有一个接受对象引用的函数。在一个特定的调用实例中,我并不关心函数如何处理特定对象。因此,我希望我能避免在主函数中创建该对象。
代码如下:
#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");
}
答案 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();
}