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

use*_*538 0 c++ rvalue c++11

我有以下代码:

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

Lig*_*ica 6

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

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

是.

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

潜在的.但是你使用的API不支持它们,你说你不能改变它,所以就是这样.这可能的黑客绕过这个限制,但只能用复杂,我不打算在这里赘述了.

但老实说,我不担心.你的编译器非常聪明,不会使你的第一种方法比你的第二种方法更高效或更低效,你的第一段代码的冗长实际上使它更清晰,更容易阅读.