Преобразовать временные ссылки в C ++

0

У меня есть следующий код:

#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
    Бесплатный помощник функции: template<class T> void print(llvm::Module* mod, T&& os, llvm::AssemblyAnnotationWriter* AAW) { return mod->print(os, AAW); } (обратите внимание, что переменная rvalue ref является выражением lvalue) Или как не шаблонная void print(llvm::Module* mod, llvm::raw_os_ostream&& os, llvm::AssemblyAnnotationWriter* AAW); который не будет работать для lvalues, хотя (необходимо перегрузить)
  • 1
    Разница лишь в том, что вторая версия менее читаема, чем первая. Почему вы хотите изменить это? Называть вещи хорошо.
Показать ещё 1 комментарий
Теги:
c++11
rvalue

1 ответ

6
Лучший ответ

Прежде всего, это не то, что "временно" означает в C++. У вас просто есть обычный объект, который используется только один раз. У временных лиц нет имен; на самом деле, только в вашем втором примере объект потока является временным!

Можно ли это сделать с помощью C++ 11 ссылок на rvalue?

Да.

Я не могу изменить API. Разве это не должно использоваться для ссылок на rvalue?

Потенциально. Но API, который вы используете, не поддерживает их, и вы сказали, что не можете его изменить, так что. Это ограничение можно взломать, но только со сложностью, в которую я не буду входить.

Честно говоря, я бы не стал беспокоиться об этом. Ваш компилятор достаточно умен, чтобы сделать ваш первый подход более или менее эффективным, чем ваш второй, и многословие вашего первого фрагмента кода делает его более понятным и понятным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню