2016-04-11 9 views
4

Entschuldigung, wenn dies ein Duplikat ist .. Hoffentlich ist es nicht. Ich durchsuchte eine lange Liste von Fragen, aber sie alle schienen es nicht wirklich zu erklären.Den rohen Zeiger von einem intelligenten Zeiger erhalten

Hier geht: Im follwoing

int main(int,char**){ 
    auto a = make_unique<std::string>("Hello World"); 

    // do stuff with either &*a or a.get() 

    return 0; 
} 

gibt es einen Unterschied zwischen &*a und a.get()? Ich weiß, dass beide den rohen Zeigerwert zurückgeben (es sei denn ist überladen), aber gibt es irgendwelche Laufzeitvorteile, um den anderen zu wählen?

+4

'& * a' ist undefiniertes Verhalten, wenn der rohe Zeiger nullptr ist. –

+0

Wäre "& * a" nicht einfach 0, wenn "a" "nullptr" wäre? – Born2Smile

+0

bevorzugen "Get", das ist, wofür es ist, deutlicher vermittelt Absicht, und ist leichter zu lesen – sp2danny

Antwort

6

&*a ist undefiniertes Verhalten, wenn der Zeiger nullptr ist. Sie können mehr über undefiniertes Verhalten lernen here.

In allen anderen Fällen würde ich erwarten, dass beide Lösungen ziemlich gleichwertig sind. Ich würde lieber get() verwenden, weil dies der direkte Weg ist, den jeder versteht.

Aus dem C++ Standard:

20.9.1.2.4 unique_ptr Beobachter [unique.ptr.single.observers]

Typname add_lvalue_reference :: type operator *() const;
1 Benötigt: get()! = Nullptr.
2 Rückgabe: * get().

+0

+1 für die Standards Referenz :) Ich habe versucht, einmal mit jedem kompilieren .. 'g ++ -o test test.cpp. .. die Binärdateien unterscheiden sich, also nicht ganz dasselbe, denke ich. Nicht sicher, wie man sagt, was schneller ist. – Born2Smile

+1

@ born2smile Verwenden Sie den Optimierer (-O) und vergleichen Sie –

+0

ah, tatsächlich. Mit dem Optimierer kompilieren die beiden zum selben Code. Ich frage mich, welche Konsequenzen das hat, wenn 'a'' nullptr' ist. – Born2Smile