2016-07-04 11 views
21

Ich habe immer gedacht, dass es const Einheimischen constVermeiden const Einheimische, die zurückgegeben werden?

void f() { 
    const resource_ptr p = get(); 
    // ... 
} 

jedoch letzte Woche habe ich beobachtet Studenten zu haben gut ist, die auf einer C++ Übung gearbeitet und wunderte sich über ein const Zeiger

resource_ptr f() { 
    const resource_ptr p = get(); 
    // ... 
    return p; 
} 

Hier zurückgegeben werden Wenn der Compiler NRVO nicht anwenden kann (stellen Sie sich ein Szenario vor, bei dem das wahr ist, vielleicht einen von zwei Zeigern abhängig von einer Bedingung), wird die const plötzlich zu einer Pessimierung, weil der Compiler nicht von p verschoben werden kann const.

Ist es eine gute Idee, const auf zurückgekehrten Einheimischen zu vermeiden, oder gibt es einen besseren Weg, damit umzugehen?

+0

Kann es nicht von der 'const' local sowieso über als-ob-Regel bewegen? –

+0

In der Praxis neigen Compiler dazu, (N) RVO in irgendwelchen, aber den einfachsten Fällen ziemlich schlecht anzuwenden, so dass dies ein vernünftiges Anliegen ist. Ein spezieller Fall ist, wenn Ihre "lokale Variable" tatsächlich ein Argument ist, bei dem die Eliminierung von Daten leider verboten ist. –

+0

Sollte ein Compiler nicht feststellen können, dass die Lebensdauer von 'p' endet und sich trotzdem bewegt? – Pixelchemist

Antwort

15

Ist es eine gute Idee, const auf zurückgekehrt Einheimischen zu vermeiden, oder gibt es einen besseren Weg, damit umzugehen?

Ja. In der Tat, wenn resource_ptr ein move-only Typ ist, erhalten Sie einen Fehler bei der Kompilierung, wenn Sie versuchen, einen zurückzugeben, der const ist.

Dies ist ein Beispiel dafür, wo der "bewährte C++ 98/03-Hinweis" in C++ 11 und höher nicht mehr gilt.

+1

Gibt es irgendeinen Fall, in dem obligatorische Elision (C++ 17) Dinge hier ändert? –

+1

@MarcGlisse: Ich lerne immer noch die neuen C++ 17 Regeln selbst. Aber mein derzeitiges Verständnis ist, dass die obligatorische Elision nur für den Fall gilt, wo ein unbenanntes temporäres zurückgegeben wird. Zum Beispiel: 'return X {};'. –

+0

@HowardHinnant würde eine Regel, die "p" const bis zur 'return'-Anweisung nicht besser macht, wenn es keine anderen Verweise auf' p' nach der 'return' gibt (dtors von Locals, die nach' p' deklariert sind)? Die Rückkehr würde das "const" ignorieren. Ich mag diese "Fallstricke" nicht, die auf jede andere Codezeile warten. –

Verwandte Themen