Erros, bugs, perguntas - página 1730

 
Ilyas:
Isso mesmo, aqui na dactilografia, T = A *

Depois há aqui um erro de compilação

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. Li todas estas alegações e ainda não consigo entender onde está o problema. Vai guardar estes ficheiros numa disquete?


Desgasta o seu disco quando guarda um ficheiro de 100K em vez de um de 50K? (Não é engraçado para si? )

É normal que devido a um único carácter de copyright (que em princípio é internacional e está em todas as codificações, apesar do seu código ser superior a 127) o tamanho do ficheiro seja duplicado sem qualquer sentido? Não é inteligente? Porquê inchar os ficheiros por 2 vezes sem qualquer necessidade?

Não é apenas o tamanho que é o problema, é também a busca contextual. Desde que os ficheiros estejam em ASCII, pode utilizar muitos programas de terceiros, incluindo gestores de ficheiros, para pesquisar ficheiros utilizando a cadeia de contexto. Utilizo isto quase todos os dias. O editor MQ nativo é tão zilch a este respeito como em muitas outras questões de codificação óbvias. Uma vez que temos unicode, a pesquisa de contexto tem dois problemas: nem todos os programas podem ou querem fazer isso, e para aqueles que podem, obtemos o ponto 2 - lentidão.

Claro que algumas pessoas acham mais fácil comprar um computador mais rápido para além do disco rígido do que pensar ou pelo menos aprender com outros produtos como o software deve ser de fácil utilização e eficiente.

 
A100:

Depois há aqui um erro de compilação

Também em C++ existe uma ambiguidade do tipo: const T const

Mas há uma saída - mover constante para a direita

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 sem erros (considerando a diferença de sintaxe)
 
A100:

Também em C++, há ambiguidade do tipo: const T const

Mas há uma saída - mover constante para a direita

C++ compila sem erros (dada a diferença de sintaxe)

Mas logicamente é estranho quando "const A" e "A const" significam a mesma coisa.

Talvez"Aconst*" seja um ponteiro constante para um objecto não-constritivo.

Este parece ser o caso. Porque tal construção existe.

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

Não se pode alterar o ponteiro, não se pode alterar por referência e não se pode alterar o(s) objecto(s).

Do ponto de vista de obter um código rápido, poderia tal construção dar uma dica adequada ao compilador?

 
Stanislav Korotky:

É normal que um único carácter de copyright (que em princípio é internacional e está presente em todas as codificações, apesar de o seu código ser superior a 127) faça com que o tamanho do ficheiro aumente 2 vezes...

Sim. Para todos os efeitos, não vejo a utilidade de poupar em fósforos.
 
É interessante que, nesta construção
class A {};
void f( const A const * & a[] ) {}

Não se pode alterar os elementos, mas pode-se alterar o tamanho da matriz.

Engraçado, acontece que os métodos podem ter este aspecto

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

É possível que"Aconst*" seja um ponteiro constante não para um objecto constante.

Se não for um padrão, então "A const *" é igual a "const A *", e se for um padrão, por essa situação (em C++ )
 
A100:
Se não for um padrão, então "A const *" é igual a "const A *", e se for um padrão, então por situação
Portanto, não deve haver equivalência. A MQL considera-o equivalente, no entanto
class A
{
public:
  int i;
};

void f( A const * & a[] )
{
  a[0].i = 1; // 'i' - constant cannot be modified
}
Na minha opinião, há aqui um erro. Porque é um conjunto de apontadores constantes (const *) a ser passado, não um conjunto de apontadores para objectos constantes(const A).
 
A100:
Especificamente isto - fixado no futuro https://www.mql5.com/ru/forum/1111/page1749#comment_2892563
Então não deve haver equivalência na sua declaração
A100:
Se não for um padrão, então "A const *" é igual a "const A *", e se um padrão - por essa situação (em C++ )
 
fxsaber:
É interessante que num desenho como este...
class A {};
void f( const A const * & a[] ) {}

elementos não podem ser alterados, mas o tamanho da matriz pode ser alterado.

A sério? Isso é uma chatice, não deveria ser assim.