- Функция возвращает std::optional, но локальная переменная является std::string.
- NRVO здесь не применяется, поскольку тип возвращаемого значения функции (std::optional) отличается от локального типа (std::string), поэтому используется необязательный конструктор преобразования.
- В версии A (return fileContents;), std::optional копирует строку или перемещает ее?
- В версии B (return std::move(fileContents);), гарантированно ли строка будет перемещена в необязательный?
- Какая форма здесь считается идиоматической, или на практике разница незначительна?
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
Мобильная версия