Ошибки, баги, вопросы - страница 1730

 
Ilyas:
Всё правильно, здесь при типизации, T = A *

Тогда здесь ошибка при компиляции

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:
Именно. Читаю все эти претензии и никак не могу врубиться, где тут проблема. На дискете, что ли, собираетесь хранить эти файлы? 


Что, изнашивается диск, когда сохраняете 100-килобайтный файл вместо 50-килобайтного? Самому не смешно? )

А это нормально, что из-за одного символа копирайта (который в принципе является интернациональным и есть во всех кодировках, несмотря на то что его код больше 127) размер файла увеличивается в 2 раза без всякого смысла? Это умно да? Зачем раздувать файлы в 2 раза без надобности?

Проблема не только в размере, но и в контекстном поиске. Пока файлы в ASCII, можно многими сторонними программами, включая файл-менеджеры искать файлы по контекстной строке. Я этим пользуюсь практически каждый день. Родной MQ редактор в этом плане такой же ноль как и во многих других очевидных кодерских вопросах. Как только получаем уникод, с контекстным поиском возникают 2 беды: нельзя искать влоб (как последовательность байтов), т.к. нужно сперва "понять" кодировку, потом нормализовать к единому виду (например, все ASCII на лету кодировать в уникод) и только потом "искать" - не все программы так умеют или хотят делать, а для тех, что умеют получаем пункт 2 - тормоза.

Конечно некоторым проще в довесок к винту прикупить новый комп побыстрее, чем подумать или хотя бы поучиться на примере других продуктов, каким должно быть удобное и эффективное ПО.

 
A100:

Тогда здесь ошибка при компиляции

В С++ тоже неоднозначность типа: const T const 

Но выход есть - переставить const вправо

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 учетом разницы синтаксиса)
 
A100:

В С++ тоже неоднозначность типа: const T const

Но выход есть - переставить const вправо

С++ компилирует без ошибок (у учетом разницы синтаксиса)

Но логически же странно получается, когда "const A" и "A const" обозначают одно и то же.

Возможно, что "const *"  - это константный указатель не на константный объект.

Похоже, что именно так. Т.к. такая конструкция имеет место быть

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

Нельзя менять указатель, нельзя менять по ссылке и нельзя менять объект(-ы).

С точки зрения получения быстрого кода, такая конструкция может сделать нужную подсказку компилятору?

 
Stanislav Korotky:

А это нормально, что из-за одного символа копирайта (который в принципе является интернациональным и есть во всех кодировках, несмотря на то что его код больше 127) размер файла увеличивается в 2 раза...

Да. Хоть убейте, не вижу смысла в этой экономии на спичках.
 
Интересно, что в такой конструкции
class A {};
void f( const A const * & a[] ) {}

менять элементы нельзя, а вот изменять размер массива - вполне.

Прикольно, получается, что методы могут выглядеть так

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

Возможно, что "const *"  - это константный указатель не на константный объект.

Если не шаблон, то "A const *" равнозначно "const A *", а если шаблон - по то ситуации (в С++ )
 
A100:
Если не шаблон, то "A const *" равнозначно "const A *", а если шаблон - то по ситуации 
Так не должно быть равнозначности. MQL считает это равнозначным, однако
class A
{
public:
  int i;
};

void f( A const * & a[] )
{
  a[0].i = 1; // 'i' - constant cannot be modified
}
По-моему, здесь ошибка. Т.к. передается массив константных указателей (const *), а не массив указателей на константные объекты (const A).
 
A100:
Конкретно это - исправили в будущем https://www.mql5.com/ru/forum/1111/page1749#comment_2892563
Тогда равнозначности не должно быть в Вашем утверждении
A100:
Если не шаблон, то "A const *" равнозначно "const A *", а если шаблон - по то ситуации (в С++ )
 
fxsaber:
Интересно, что в такой конструкции
class A {};
void f( const A const * & a[] ) {}

менять элементы нельзя, а вот изменять размер массива - вполне.

Серьезно? Жесть, не должно быть так.
Причина обращения: