Sollte ich std::move verwenden, wenn ich einen lokalen std::string als std::optional zurückgebe?C++

Programme in C++. Entwicklerforum
Anonymous
 Sollte ich std::move verwenden, wenn ich einen lokalen std::string als std::optional zurückgebe?

Post by Anonymous »

Meine Verwirrung betrifft die return-Anweisung in readFileContents:
  • Die Funktion gibt std::optional zurück, aber die lokale Variable ist ein std::string.
  • NRVO gilt hier nicht, da der Rückgabetyp der Funktion (

    Code: Select all

    std::optional
    ) unterscheidet sich vom lokalen Typ (

    Code: Select all

    std::string
    ), daher wird der optionale Konvertierungskonstruktor von verwendet.
Fragen:
  • In Version A (

    Code: Select all

    return fileContents;
    ), kopiert std::optional die Zeichenfolge oder verschiebt sie?
  • In Version B (

    Code: Select all

    return std::move(fileContents);
    ), wird die Zeichenfolge garantiert in den optionalen verschoben?
  • Welche Form wird hier als idiomatisch angesehen, oder ist der Unterschied in der Praxis vernachlässigbar?
Ich habe mir die Konstruktorvorlage std::optional optional(U&& value) angesehen und weiß, dass es sich um eine Weiterleitungsreferenz handelt, aber ich bin es Ich bin mir nicht ganz sicher, wie sich die Überladungsauflösung in diesem Zusammenhang mit dem Rückgabeausdruck lvalue vs. rvalue verhält.

Code: Select all

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);
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post