我有以下代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我想做的是改变这个:
llvm::raw_os_ostream os(std::cerr);
TheModule->print(os, NULL);
Run Code Online (Sandbox Code Playgroud)
对此:
TheModule->print(llvm::raw_os_ostream(std::cerr), NULL);
Run Code Online (Sandbox Code Playgroud)
即删除不需要的临时变量.这在C++中是否可行?
打印功能参考:
void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW) const
Run Code Online (Sandbox Code Playgroud)
那么有没有办法将临时对象转换为引用?这可以用C++ 11 rvalue引用来完成吗?我无法更改API.这不应该是rvalue引用的用例吗?
首先,这不是C++中"临时"的含义.你只需要一个只使用一次的普通对象.临时工没有名字; 事实上,只有在你的第二个例子中,流对象才是临时的!
这可以用C++ 11 rvalue引用来完成吗?
是.
我无法更改API.这不应该是rvalue引用的用例吗?
潜在的.但是你使用的API不支持它们,你说你不能改变它,所以就是这样.这是可能的黑客绕过这个限制,但只能用复杂,我不打算在这里赘述了.
但老实说,我不担心.你的编译器非常聪明,不会使你的第一种方法比你的第二种方法更高效或更低效,你的第一段代码的冗长实际上使它更清晰,更容易阅读.