Errores, fallos, preguntas - página 1730

 
Ilyas:
Así es, aquí en la tipificación, T = A *

Entonces hay un error de compilación aquí

template<typename T>
void f1( const T  const & a[] ) {} //error: 'const' - unexpected token
class A {};
void f2( const A* const & a[] ) {}
class B {
        void g1() const { f1( a ); }
        void g2() const { f2( a ); }
        A *a[];
};
 
Sergei Vladimirov:
Exactamente. Leo todas estas afirmaciones y sigo sin entender dónde está el problema. ¿Vas a almacenar estos archivos en un disquete?


¿Se desgasta el disco cuando se guarda un archivo de 100K en lugar de uno de 50K? (¿No te hace gracia? )

¿Es normal que por un solo carácter de copyright (que en principio es internacional y está en todas las codificaciones, aunque su código sea mayor que 127) se duplique el tamaño del archivo sin ningún sentido? ¿No es inteligente? ¿Por qué inflar los archivos 2 veces sin necesidad?

El problema no es sólo el tamaño, sino también la búsqueda contextual. Siempre que los archivos estén en ASCII, puede utilizar muchos programas de terceros, incluidos los gestores de archivos, para buscar archivos utilizando la cadena de contexto. Lo uso casi todos los días. El editor nativo de MQ es tan nulo en este aspecto como en muchos otros aspectos de codificación evidentes. Una vez que tenemos unicode, la búsqueda contextual tiene dos problemas: no todos los programas pueden o quieren hacerlo, y para los que pueden, tenemos el punto 2: la lentitud.

Por supuesto, a algunas personas les resulta más fácil comprar un ordenador más rápido además del disco duro que pensar o, al menos, aprender de otros productos cómo debe ser el software de fácil manejo y eficiente.

 
A100:

Entonces hay un error de compilación aquí

También en C++ hay ambigüedad de tipo: const T const

Pero hay una salida: mover la const a la derecha

template<typename T>
void f1(  T         const & a[] ) {} //error: 'const' - unexpected token
class A {};
void f2(  A const * const & a[] ) {} //нормально
class B {
        void g1() const { f1( a ); } //error: 'f1' - cannot to apply function template
        void g2() const { f2( a ); } //нормально
        A *a[];
};
C++ compila sin errores (teniendo en cuenta la diferencia de sintaxis)
 
A100:

También en C++ existe una ambigüedad de tipo: const T const

Pero hay una salida: mover la const a la derecha

C++ compila sin errores (dada la diferencia de sintaxis)

Pero lógicamente es extraño cuando "const A" y "A const" significan lo mismo.

Quizás"Aconst*" es un puntero constante a un objeto no-const.

Este parece ser el caso. Porque tal construcción existe.

class A {};
void f( const A const * const & a[] ) {}

No se puede cambiar el puntero, no se puede cambiar por referencia y no se puede cambiar el objeto(s).

Desde el punto de vista de la obtención de código rápido, ¿podría esta construcción dar al compilador una pista adecuada?

 
Stanislav Korotky:

¿Es normal que un solo carácter de copyright (que en principio es internacional y está presente en todas las codificaciones, a pesar de que su código es mayor que 127) haga que el tamaño del archivo aumente 2 veces...

Sí. A todos los efectos, no veo el sentido de ahorrar en los partidos.
 
Es interesante que en esta construcción
class A {};
void f( const A const * & a[] ) {}

No puedes cambiar los elementos, pero puedes cambiar el tamaño del array.

Es curioso, resulta que los métodos pueden ser así

class A {};
class B
{
  const A const * Method( const A const * const & a[] ) const
  {
    return(a[0]);
  }
};
 
fxsaber:

Es posible que"Aconst*" sea un puntero constante y no un objeto constante.

Si no es un patrón, entonces "A const *" es igual a "const A *", y si es un patrón, por esa situación (en C++ )
 
A100:
Si no es un patrón, entonces "A const *" es igual a "const A *", y si es un patrón, entonces por situación
Por lo tanto, no debería haber ninguna equivalencia. Sin embargo, MQL lo considera equivalente
class A
{
public:
  int i;
};

void f( A const * & a[] )
{
  a[0].i = 1; // 'i' - constant cannot be modified
}
En mi opinión, aquí hay un error. Porque se está pasando un array de punteros constantes (const *), no un array de punteros a objetos constantes(const A).
 
A100:
Específicamente esto - arreglado en el futuro https://www.mql5.com/ru/forum/1111/page1749#comment_2892563
Entonces no debería haber ninguna equivalencia en su declaración
A100:
Si no es un patrón, entonces "A const *" es igual a "const A *", y si es un patrón - por esa situación (en C++ )
 
fxsaber:
Es interesante que en un diseño como este...
class A {};
void f( const A const * & a[] ) {}

Los elementos no pueden ser modificados, pero el tamaño de la matriz sí.

¿De verdad? Es una pena, no debería ser así.