Должен ли я использовать std::move при возврате локального std::string как std::optional?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Должен ли я использовать std::move при возврате локального std::string как std::optional?

Сообщение Anonymous »

Моя путаница связана с оператором return внутри readFileContents:
  • Функция возвращает std::optional, но локальная переменная является std::string.
  • NRVO здесь не применяется, поскольку тип возвращаемого значения функции (std::optional) отличается от локального типа (std::string), поэтому используется необязательный конструктор преобразования.
Вопросы:
  • В версии A (return fileContents;), std::optional копирует строку или перемещает ее?
  • В версии B (return std::move(fileContents);), гарантированно ли строка будет перемещена в необязательный?
  • Какая форма здесь считается идиоматической, или на практике разница незначительна?
Я просмотрел шаблон конструктора std::optional option(U&& value) и знаю, что это ссылка на пересылку, но Я не совсем уверен, как в этом контексте ведет себя разрешение перегрузки с возвращаемым выражением lvalue vs rvalue.

namespace FS = std::filesystem;
using OptionalString = std::optional;

OptionalString readFileContents(const FS::path& filePath) {
std::ifstream inputStream(filePath);

if (!inputStream) {
return std::nullopt;
}

std::string fileContents{
std::istreambuf_iterator{inputStream},{}};

// version A
return fileContents;

// version B
// return std::move(fileContents);
}

int main() {
std::string_view filePath{ "test.txt" };
auto maybeFileContents = readFileContents(filePath);
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... ptionalstd
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»