2016-04-30 17 views
0

in einem beliebigen Programmiersprache ohne Zeiger mit Garbage Collector Itemporäres Objekt als Argument auf dem Stapel

DrawLine(new Vector(0, 0), new Vector(100, 100)); 

Aber in C tun kann ++ können wir nicht, wenn DrawLine sind nicht verantwortlich für seine Argumente zu löschen, so dass die kürzester Weg DrawLine mit zwei Vektoren (0,0) und (100,100) aufzurufen ist:

Vector v(0, 0); 
Vector w(100, 100); 
DrawLine(v, w); 

gibt es eine Möglichkeit, dies zu einer einzigen Aussage zu machen? Vor allem, wenn v und w nur Argumente für diese einzelne Funktion sind und keine andere Funktion sie verwendet, scheint es ein bisschen ausführlich. Warum kann ich nicht tun, nur so etwas wie:

DrawLine(Vector(0, 0), Vector(100, 100)); 
+1

"Warum kann ich nicht tun, nur so etwas wie:' DrawLine (Vector (0, 0), Vektor (100, 100)); '" Weil 'DrawLine' dumm genug ist lvalues ​​oder den Compiler erfordern ist kaputt? – MikeCAT

+0

Die Zeile [funktioniert] (https://ideone.com/isPOZG). Ein weiterer Fall, in dem * du * das nicht tun kann, ist, dass es in deinen Kodierungskonventionen verboten ist. – MikeCAT

+0

@MikeCAT, Danke! Du hast Recht, es kompiliert! – Carucel

Antwort

2

Warum kann ich nicht einfach so etwas wie:

DrawLine(Vector(0, 0), Vector(100, 100)); 

Sie versuchen, temporäre Variablen als Argument übergeben. Sie können es in 3 Fällen tun.

  1. Wenn DrawLine nimmt durch konstante Referenz übergebenen Parameter:

    void DrawLine(const Vector& v1, const Vector& v2);

  2. Wenn Vector kopiert werden konnten, und DrawLine nimmt als Wert übergeben Parameter:

    void DrawLine(Vector v1, Vector v2);

  3. Wenn Vector könnte bewegt werden und nimmt DrawLine Parameter durch rvalue Referenz übergeben:

    void DrawLine(Vector&& v1, Vector&& v2);

Der einzige Fall, andernfalls wird durch Übergabe von Parametern nicht konstante Referenz, da temporäre Variable nicht daran gebunden werden konnte.

void DrawLine(Vector& v1, Vector& v2);