在C ++中将临时转换为引用

时间:2014-03-19 15:01:20

标签: c++ c++11 rvalue

我有以下代码:

#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引用的用例吗?

1 个答案:

答案 0 :(得分:6)

首先,这不是“临时”在C ++中的含义。你只需要一个只使用一次的普通对象。临时工没有名字;事实上,只有在你的第二个例子中,流对象是临时

  

可以使用C ++ 11 rvalue引用来完成吗?

  

我无法更改API。这不应该是rvalue引用的用例吗?

潜在。但是你使用的API不支持它们,你说你不能改变它,所以就是这样。它 可能会破解这个限制,但只有复杂性我才不会进入这里。

老实说,我不担心。你的编译器非常聪明,不会让你的第一种方法比你的第二种方法效率更高或更低,而你的第一段代码的详细程度实际上使它更清晰,更容易阅读。