2013-02-27 4 views
9
  • l'elenco end() restituisce una copia dell'iteratore passato-end, giusto?
  • Pertanto, list.end() è un valore massimo, giusto?
  • la funzione -operatore-overloaded per l'elenco iteratore richiede un riferimento non-const, giusto?
  • non è possibile associare rvalues ​​a riferimenti non const, giusto?

Quindi, come mai si faperché compila --list.end()?

std::list<int> lst; 
// ... 
--l.end();` 

compilare?

Come correttamente sottolineato, il mio terzo punto non ha necessariamente ragione. Ma allora che ne dici di questo codice che compila anche?

struct A{}; 

void f(A&) 
{ 

} 
A a() 
{ 
    return A(); 
} 

int main() 
{ 
    f(a()); 
} 
+2

Il terzo punto è sbagliato. – Nawaz

+0

@banuj: Non capisco –

+0

Non sono d'accordo sul fatto che il tuo secondo esempio compili: http://ideone.com/V98wW3 –

risposta

12
  • l'operatore --funzione in overload per la lista iteratore prende un riferimento non-const, giusto?

Questo punto è errato. Il operator-- è una funzione membro e una funzione membro può essere invocata su un temporaneo. Non si passa alcun oggetto a questa funzione membro come argomento. quindi la questione del rvalore di legame al riferimento non const non si pone in primo luogo.


quanto riguarda la modifica (passando rvalue a f(A&){}), è un'estensione non standard. I indovina stai usando Microsoft Compiler, perché so che ha questa estensione non standard che è stupida secondo me.

+0

Oh ... giusto :) Sono sciocco. Il resto della logica è sano, vero? :) –

+0

Btw, ha il mandato standard che - essere un membro? O è definito dall'implementazione? –

+0

In realtà non è necessariamente una funzione membro. L'iteratore potrebbe essere un puntatore. –