我有以下代码:
#include <iostream>
#include <llvm/Module.h>
#include <llvm/LLVMContext.h>
#include <llvm/Support/raw_os_ostream.h>
int main()
{
llvm::Module *TheModule = new llvm::Module("my cool jit", llvm::getGlobalContext());
llvm::raw_os_ostream os(std::cerr);
TheModule->print(os, NULL);
return 0;
}
我想要做的就是改变这个:
llvm::raw_os_ostream os(std::cerr);
TheModule->print(os, NULL);
到此:
TheModule->print(llvm::raw_os_ostream(std::cerr), NULL);
即。删除不需要的临时变量。这在C ++中是否可行?
打印功能需要参考:
void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW) const
那么有没有办法将临时对象转换为引用?这可以用C ++ 11 rvalue引用来完成吗?我无法更改API。这不是rvalue引用的用例吗?
答案 0 :(得分:6)
首先,这不是“临时”在C ++中的含义。你只需要一个只使用一次的普通对象。临时工没有名字;事实上,只有在你的第二个例子中,流对象是临时!
可以使用C ++ 11 rvalue引用来完成吗?
是
我无法更改API。这不应该是rvalue引用的用例吗?
潜在。但是你使用的API不支持它们,你说你不能改变它,所以就是这样。它 可能会破解这个限制,但只有复杂性我才不会进入这里。
老实说,我不担心。你的编译器非常聪明,不会让你的第一种方法比你的第二种方法效率更高或更低,而你的第一段代码的详细程度实际上使它更清晰,更容易阅读。