Ich lese auf Kopie Elision (und wie es in C++ 17 garantiert werden soll) und dies hat mich ein wenig verwirrt (ich bin mir nicht sicher, ich weiß Dinge, die ich dachte, ich wusste vorher). So ist hier ein minimaler Testfall:Was passiert in dieser Rückmeldung?
std::string nameof(int param)
{
switch (param)
{
case 1:
return "1"; // A
case 2:
return "2" // B
}
return std::string(); // C
}
So wie ich es sehe, Fälle A und B eine direkte Konstruktion auf dem Rückgabewert auszuführen, so kopiert elision keine Bedeutung hat hier, während Fall C nicht Kopie elision durchführen kann, weil es mehrere Rückwege. Sind diese Annahmen korrekt??
Auch würde ich gerne wissen, ob
- gibt es einen besseren Weg, um die oben schreiben (zB hat ein
std::string retval;
und zurück immer, dass ein oder FallA
undB
alsreturn string("1")
usw. schreiben) - Es gibt irgendeine Bewegung, zum Beispiel
"1"
ist ein temporäres, aber ich nehme an, dass es als ein Parameter für den Konstruktor vonstd::string
- verwendet wird, gibt es Optimierungsinteressen, die ich weggelassen habe (zB glaube ich, dass C alsgeschrieben werden könnte, wäre das eine bessere Wahl?)
Warum denken Sie, Fall A von Fall C. Eine andere ist effektiv 'std :: string ("1")' und C 'std :: string ("")' –
@KerrekSB Nichts –
@EdHeal ich für Fall C glauben als äquivalent zu 'std :: string („1“)' Kopie elision hat es geschehen oder es keinen Unterschied aus direkt in den Rückgabewert konstruieren? Oder sind die verschiedenen Rückwegpfade mit der Kopie Elision? Wie auch immer, das ist, was ich frage mich also nicht fragen –