如何将右值作为引用参数传递给函数
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();
}
我有一个获取对象引用的函数。在一个特定的调用实例中,我不关心函数如何处理该特定对象。因此我希望我可以避免在主函数中创建该对象。
代码如下:
#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();
}