Errori, bug, domande - pagina 2419

 
Alexey Navoykov:

Che ne diresti di aggiungere al linguaggio la possibilità di passare un argomento come valore r? Questo risolverebbe immediatamente tutti i problemi e permetterebbe di creare contenitori universali per qualsiasi tipo.

Come? ) I contenitori universali hanno bisogno di link e frecce, non di questa roba.

E l'utente medio non è quello che fa l'r-value.

 
Alexey Navoykov:

Cosa ne pensate di aggiungere al linguaggio la possibilità di passare un argomento come valore r? Questo risolverebbe immediatamente tutti i problemi e permetterebbe di creare contenitori universali per qualsiasi tipo. In particolare, il metodo di cui sopra sarebbe sovraccaricato per r-valore:

Questo è esattamente il modo in cui è implementato in tutti i contenitori STL.

E il secondo vantaggio: permetterà di definire costruttori di spostamento. Ora questo è anche molto mancante, in particolare per l'implementazione di puntatori intelligenti unique_ptr e altre classi, progettate per memorizzare in monopolio qualche risorsa unica all'interno, cioè i soliti costruttori di copia sono inaccettabili per loro.

Che senso ha allora passare un parametro per riferimento?

 
Slava:

Che senso ha allora passare il parametro per riferimento?

Lei fa domande molto strane. I link r-value sono solo per spostare la semantica. i link normali sono per tutto il resto.
 
Slava:

Che senso ha allora passare il parametro per riferimento?

Nemmeno io capisco bene di che tipo di riferimento stai parlando. Originariamente, stavamo dicendo che i riferimenti l-value (disponibili in MQL) non coprono tutte le esigenze, il che è stato dimostrato dall'impossibilità di passare una costante o un valore di espressione a tale funzione. Per questo scopo, è necessario il riferimento r-value, che accetterà tutti gli altri tipi. Così, la combinazione di due funzioni sovraccaricate per r-value e l-value garantirà che tutti i tipi di argomenti saranno accettati, indipendentemente dalla loro origine.

Quello che hai detto, che una costante non è memorizzata da nessuna parte, ma creata al volo, significa che dovrebbe essere passata come valore r, non come valore l (a differenza del C++). Non fa alcuna differenza fondamentale in che modo viene interpretata, la cosa principale è che può essere accettata in una funzione.

 
Alexey Navoykov:

Quello che hai detto, che la costante non è memorizzata da nessuna parte, ma è creata al volo, significa che deve essere passata come valore r, non come valore l (a differenza del C++). Non fa alcuna differenza in linea di principio in quale forma è interpretata, purché la si possa accettare in una funzione.

Il riferimento al valore r implica in realtà un oggetto per il quale sarà fatto lo spostamento, cioè deve essere ancora creato un oggetto temporaneo.

 
TheXpert:

Beh, in realtà il riferimento al valore r implica che c'è un oggetto per il quale lo spostamento sarà fatto, cioè un oggetto temporaneo deve essere creato comunque.

Ovviamente, l'oggetto esiste sempre da qualche parte. Ho scritto che questo oggetto è creato al volo, cioè temporaneo.

Ma credo di aver capito cosa chiedeva Slava. Intendeva dire perché abbiamo bisogno di accettare un oggetto temporaneo per riferimento quando possiamo accettarlo per valore.

Bene, il punto è che è impossibile sovraccaricare una funzione contemporaneamente per riferimento e valore in una sola copia:

template<typename T>
 void f(T) { }
template<typename T>
 void f(T const&) { }
 
class A { };

void OnStart()
{
  A a;
  f(a);
  const int b=0;
  f(b);  // 'f' - ambiguous call to overloaded function with the same parameters
}

Questo rende problematico scrivere soluzioni universali. E sostituendo il valore con r-value, otteniamo una variante funzionante:

template<typename T>
 void f(T &&) { }
template<typename T>
 void f(T const&) { }
 
Alexey Navoykov:

Intendeva dire: perché prendere un oggetto temporaneo per riferimento quando si può prenderlo per valore.

perché

void f(int) {}
void f(const int&) {}

void OnStart()
{
   const int x = 0;
   f(x); // 'f' - ambiguous call to overloaded function with the same parameters
}

e perché di solito è più conveniente passare qualcosa per riferimento che per valore.

E se il metodo è templato (che è dove tutto è iniziato), allora il comportamento attuale semplicemente non permette di scrivere correttamente.

 
TheXpert:

E se il metodo è basato su template (che è dove tutto è iniziato), allora il comportamento attuale semplicemente non permette di scrivere correttamente.

Sì, ho sostituito il mio esempio con uno di template per renderlo più chiaro, perché gli int passati per riferimento non sembrano davvero molto convincenti)
 
Alexey Navoykov:

E sostituendo il valore con il valore r, otteniamo una versione funzionante:

non proprio)

la semantica di spostamento implica dire all'oggetto da spostare che non ha bisogno di rimuovere i suoi interni. se l'oggetto è costante, avreste bisogno di un membro di classe mutabile, mql non lo supporta

 
TheXpert:

non proprio)

la semantica move implica dire all'oggetto da spostare che non ha bisogno di rimuovere i suoi interni. se l'oggetto è una costante, avete bisogno di un membro di classe mutabile, mql non supporta questo

Sì, hai ragione, const per r-value non deve essere impostato (non si compila così in plus). Lo correggerò ora)