Как принять неконстантный тип параметра rvalue и lvalue - PullRequest
0 голосов
/ 22 ноября 2018

Я неоднократно сталкиваюсь с проблемой принятия неконстантного ссылочного параметра, так как кажется, что принятие параметра 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 Ответ

0 голосов
/ 22 ноября 2018

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

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

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

Это будет обрабатывать как lvalue, так и 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...