Errores, fallos, preguntas - página 2419

 
Alexey Navoykov:

¿Qué le parecería añadir la posibilidad de pasar un argumento como valor r al lenguaje? Esto resolvería inmediatamente todos los problemas y permitiría crear contenedores universales para cualquier tipo.

¿Cómo? ) Los contenedores universales necesitan enlaces y flechas, no estas cosas.

Y el usuario medio no es el que hace el valor r.

 
Alexey Navoykov:

¿Qué opinas de añadir la posibilidad de pasar un argumento como valor r al lenguaje? Esto resolvería inmediatamente todos los problemas y permitiría crear contenedores universales para cualquier tipo. En particular, el método anterior se sobrecargaría para el valor r:

Así es exactamente como se implementa en todos los contenedores STL.

Y el segundo plus: permitirá definir constructores de movimiento. Ahora bien, esto también se echa en falta, en particular para la implementación de punteros inteligentes unique_ptr y otras clases, diseñadas para almacenar en monopolio algún recurso único en su interior, es decir, los constructores de copia habituales son inaceptables para ellos.

¿Qué sentido tiene entonces pasar un parámetro por referencia?

 
Slava:

¿Qué sentido tiene entonces pasar el parámetro por referencia?

estás haciendo preguntas muy extrañas. los enlaces de valor r son sólo para mover la semántica. los enlaces normales son para todo lo demás.
 
Slava:

¿Qué sentido tiene entonces pasar el parámetro por referencia?

Tampoco entiendo muy bien a qué tipo de referencia te refieres. Originalmente, decíamos que las referencias l-value (disponibles en MQL) no cubren todas las necesidades, lo que se demostró por la imposibilidad de pasar un valor constante o de expresión a dicha función. Para ello, se necesita la referencia r-value, que aceptará todos los demás tipos. Así, la combinación de dos funciones sobrecargadas para r-value y l-value garantizará la aceptación de todos los tipos de argumentos, independientemente de su origen.

Lo que has dicho, que una constante no se almacena en ningún sitio, sino que se crea sobre la marcha, significa que debe pasarse como valor r, no como valor l (a diferencia de C++). No hay ninguna diferencia fundamental en la forma en que se interpreta, lo principal es que pueda ser aceptada en una función.

 
Alexey Navoykov:

Lo que has dicho, que la constante no se almacena en ningún sitio, sino que se crea sobre la marcha, significa que hay que pasarla en forma de valor r, no de valor l (a diferencia de C++). En principio, no hay ninguna diferencia en la forma en que se interpreta, siempre que se pueda aceptar en la función.

La referencia del valor r implica en realidad un objeto para el que se hará el movimiento, es decir, que todavía se debe crear un objeto temporal.

 
TheXpert:

Bueno, en realidad la referencia al valor r implica que hay un objeto para el que se hará el movimiento, es decir, hay que crear un objeto temporal de todos modos.

Obviamente, el objeto siempre existe en alguna parte. Escribí que este objeto se crea sobre la marcha, es decir, es temporal.

Pero creo que he entendido lo que preguntaba Slava. Se refería a por qué necesitamos aceptar un objeto temporal por referencia cuando podemos aceptarlo por valor.

Bueno, la cuestión es que es imposible sobrecargar una función simultáneamente para la referencia y el valor en 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
}

Esto hace que sea problemático escribir soluciones universales. Y sustituyendo el valor por el valor r, obtenemos una variante que funciona:

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

Se refería a por qué tomar un objeto temporal por referencia cuando se puede tomar por valor.

porque

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
}

y porque suele ser más conveniente pasar algo por referencia que por valor.

Y si el método es templado (que es donde empezó todo), entonces el comportamiento actual no permite escribir correctamente.

 
TheXpert:

Y si el método está basado en plantillas (que es donde empezó todo), entonces el comportamiento actual simplemente no permite escribir correctamente.

Sí, he sustituido mi ejemplo por uno de plantilla para que quede más claro, porque los ints pasados por referencia realmente no parecen muy convincentes)
 
Alexey Navoykov:

Y sustituyendo el valor por el valor r, obtenemos una versión que funciona:

no realmente )

la semántica de move implica decirle al objeto que se va a mover que no necesita eliminar sus internos. si el objeto es constante, necesitaría un miembro mutable de la clase, mql no lo soporta

 
TheXpert:

no realmente )

la semántica de move implica decirle al objeto que se va a mover que no necesita eliminar sus internos. si el objeto es una constante, se necesita un miembro mutable de la clase, mql no soporta esto

Sí, tienes razón, la const para el valor r no debe ser establecida (no compila así en los pluses). Lo corregiré ahora )