Как принять неконстантный тип параметра rvalue и lvalue

Я неоднократно сталкиваюсь с проблемой принятия неконстантного ссылочного параметра, так как кажется, что принятие параметра rvalue предотвращает принятие lvalues ​​и наоборот. Вот пример

void read(File &file)// I want to modify file
{
    SomeClass someObject;
    file.readInto(&someObject);//readInto is a non-const method
    // do something with the data populated in someObject
}

Но когда я пытаюсь вызвать чтение, у меня возникает проблема, если я пробую два разных соглашения о вызовах

//this works just fine
File f1 = File::open("some_file_path");
read(f1);

// However this fails
read( File::open("some_file_path") );//because open returns an rvalue

У меня проблема, если я изменил параметр на неконстантное значение, чем я больше не могу передать значение. Обречен ли я всегда предоставлять переопределение (или шаблон), которое принимает ссылочный тип rvalue и просто вызывает переопределение lvalue?

1 ответ

Поскольку вы обновили вопрос, я предлагаю сделать это:

void read(File& file)
{
    SomeClass someObject;
    file.radInto(&someObject);
    // ...
}

void read(File&& file) { read(file); }

Это будет обрабатывать как lvalues, так и rvalues ​​с минимальным повторением кода.


Я думаю твой read функция должна просто взять File&:

void read(File& file) // I want to modify file
{
    SomeClass someObject;
    file.readInto(&someObject);//Modifies file
    // do something with the data populated in someObject
}

Тогда вы можете позвонить:

// OK
std::shared_ptr<File> f1 = File::open("some_file_path");
read(*f1);

// OK
read( *File::open("some_file_path") );

Дополнительное преимущество: функция не ограничена shared_ptrи работает с любым File независимо от того, как его память управляется.


В качестве альтернативы используйте ссылку для пересылки:

template <typename T>
void read(T&& file)// I want to modify file
{
    SomeClass someObject;
    file->readInto(&someObject);//Modifies file
    // do something with the data populated in someObject
}
Другие вопросы по тегам