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

Convert temporary to reference in C++

本文关键字:转换 引用 c++      更新时间:2023-10-16

我有以下代码:

#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++中可能吗?

print函数接受一个引用:

void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW) const

那么是否有办法将临时对象转换为引用呢?这可以用c++ 11的右值引用来实现吗?我不能更改API。这不应该是右值引用的用例吗?

首先,这不是c++中"temporary"的意思。你只是拥有一个只被使用一次的普通对象。临时工没有名字;事实上,只有在第二个示例中,流对象才是一个临时的!

这可以用c++ 11的右值引用来完成吗?

是的。

我不能更改API。这不应该是右值引用的用例吗?

可能。但你使用的API不支持它们,你说你不能改变它,就是这样。如果可以绕过这个限制,但其复杂性我不打算在这里讨论。

老实说,不过,我不会担心它。您的编译器足够聪明,不会使您的第一种方法比第二种方法效率更高或更低,并且您的第一段代码的冗长实际上使其更清晰,更易于阅读。