Баг компилятора: cannot convert from const pointer to nonconst pointer - страница 3

 
Alexey Navoykov:
Я там уже дополнил свой пост.  Он может принимать указатель на любой объект, хоть на константный, хоть нет.  

Вроде, функции f показывают, что и как могут менять. Собственно, дискутировать по этому поводу - пустое. Вы правы, что уничтожение базы СД - большое зло.

С трудом выкопал баг, благо на форум постил. Он, похоже, объясняет причину. Очень много сигнатур на самом деле формируется.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2017.04.10 16:23

Создание лишних template-перегрузок, которые приводят к ошибкам компиляции
template <typename T>
T Func()
{
  T Res;
  
  return(Res);
}

template <typename T>
void Func( T& Value )
{
  T Res = (MqlTick)Value;
}

void OnStart()
{
  Func<string>(); // без этой строки компилируется
  
  MqlTick Tick;
  
  Func(Tick);
}

Компилятор зачем-то пытается создать

void Func( string& );
 
fxsaber:

С трудом выкопал баг, благо на форум постил. Он, похоже, объясняет причину. Очень много сигнатур на самом деле формируется.

Да, это перекликается с этим багом, который я тоже запостил вчера.  С перегрузкой шаблона без аргументов компилятор не справляется.
 
Alexey Navoykov:
Я там уже дополнил свой пост

Сейчас понял, что изначально я всё верно написал.   

Давайте тогда, чтоб ни у кого не возникало путаницы, разложим по полочкам все варианты шаблонов:

T  - принимает тип любой переменной (указателя) по значению.  Внутрь функции передаётся тот же самый тип.  

const T или T const  - то же самое, что и выше, только внутри функции переменная становится константой

T&  - принимает любую переменнуюказатель) по ссылке

const T& или T const&  - Принимает константу (константный указатель) по ссылке. 

T*  - принимает любой указатель на любой тип объекта по значению 

T*const  - то же самое, что и выше, только внутри функции указатель становится константой

T*&  - принимает любой указатель на любой тип объекта по ссылке

T*const&  - принимает константный указатель на любой тип объекта по ссылке

const T* или T const*  - принимает любой указатель на константный объект по значению

const T*const или T const*const  - то же, что и выше, только внутри функции этот указатель становится константой

const T*& или T const*&  - принимает любой указатель на константный объект по ссылке

const T*const& или T const*const&  - принимает константный указатель на константный объект по ссылке

По крайней мере это правила, работающие в C++.

Обычный тип переменной естественно может приводиться в константному, кроме тех случаев, когда шаблон перегружен для соответствующего константного типа.  В таких случаях константы идут в константный шаблон, а переменные - в обычный шаблон.

p.s.  Как можно заметить, при передаче по значению, const относящийся к типу аргумента никак не влияет на поведение шаблона. Равно как и в обычных функциях. Этот const имеет значение лишь внутри функции.  Т.е. T и const T (или T const)  - равнозначны по сути.

 
Alexey Navoykov:

Сейчас понял, что изначально я всё верно написал.   

Давайте тогда, чтоб ни у кого не возникало путаницы, разложим по полочкам все варианты шаблонов:

Вроде, логично поместить это в ветку.


Для полноты картины дополнил бы описание объяснением такого случая

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2016.10.23 23:52

Наткнулся у себя на хороший пример
class A
{
public:
  void operator =( const string Value ) const { return; }

  void operator =( const int Value ) { return; }
};

void OnStart()
{
  const A a;

  a = 0; // implicit conversion from 'number' to 'string'
}
Не очевидно было в начале, почему предупреждение. Умный компилятор, однако.
Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2017.02.24
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
fxsaber:

Вроде, логично поместить это в ветку.

Да только та ветка называется "Особенности языка MQl5", а как выясняется, в MQL5 пока не всё из перечисленного работает правильно )  Лучше повесить это на стену у разработчиков MQ, как памятку )
 
Alexey Navoykov:
Да только та ветка называется "Особенности языка MQl5", а как выясняется, в MQL5 пока не всё из перечисленного работает правильно )  Лучше повесить это на стену у разработчиков MQ, как памятку )

Что работает неправильно? Как Вы определили, что работает неправильно? Была какая-то отсылка из нашей документации к стандарту C++?

Зачем весить на стену?

 
Slava:

Что работает неправильно? Как Вы определили, что работает неправильно? Была какая-то отсылка из нашей документации к стандарту C++?

Зачем весить на стену?

Ну как бы изначально ведь повелось, что синтаксис MQL стремится соответствовать синтаксису C++.

Вот даже в вашей документации в самом начале сказано:

MQL5 основан на концепции широко распространенного языка программирования С++, по сравнению с MQL4 в нем добавлены перечисления, структуры, классы и обработка событий. Благодаря расширению числа встроенных основных типов, взаимодействие исполняемых программ на MQL5 с другими приложениями посредством dll максимально облегчено. Синтаксис языка MQL5 подобен синтаксису С++, и это позволяет легко переносить на него программы из современных языков программирования.

 Поэтому не очень понимаю вас теперь. Через столько лет работы по воссозданию подобия С++ говорить, что это всё неправда?

Тем более, у вас ведь нигде в документации не прописаны правила поведения шаблонов, которые я перечислил выше.  И многое-многое другое. Следовательно, мы предполагаем, что эти правила соответствуют C++.  Если же же вы теперь заявляете, что они не должны соответствовать, что почему в документации не описаны ваши собственные правила?

 
Slava:

Что работает неправильно?

https://www.mql5.com/ru/forum/278274#comment_8636140

Slava:

Как Вы определили, что работает неправильно?

логика )

Баг компилятора: cannot convert from const pointer to nonconst pointer
Баг компилятора: cannot convert from const pointer to nonconst pointer
  • 2018.09.10
  • www.mql5.com
Билд 1881. Баг компилятора: путает константность указателя с константностью объекта, на который он ссылается. Здесь переменная a - это не константа...
 

Мы работаем над компилятором. И очень внимательно читаем форум.

Но есть нюансы. Например, назовите мне компилятор, который полностью соответствует стандарту C++. Кроме этого, даже в самом стандарте C++ достаточное количество мест, где написано: "зависит от реализации", то есть отдано на откуп компиляторостроителям.

Здесь же, в данной ветке, речь идёт не о переносе программ из C++ в MQL5. И даже не об обычном каждодневном программировании. Речь идёт об экзотических случаях: "смотрите, что я нашёл"

 
Slava:

Но есть нюансы. Например, назовите мне компилятор, который полностью соответствует стандарту C++. Кроме этого, даже в самом стандарте C++ достаточное количество мест, где написано: "зависит от реализации", то есть отдано на откуп компиляторостроителям.

в стандарте места отданные на откуп компиляторостроителям называются UB. насколько я понимаю, в шаблонах UB невозможны в принципе, потому что это действия времени компиляции. ошибки в компиляторах конечно есть, но к багрепортам по стандарту все основные компиляторы относятся очень даже серьезно. это раз.

mql сделан на базе C++, поэтому логично, что когда возникают вопросы по поведению, идет обращение к базе. если ваша реализация отличается, то было бы очень круто увидеть эти отличия в каком-то месте, прописанные явно разработчиками явно. Тогда не будет гадания как и что должно работать, не будет таких веток, а если будут, их можно будет решать одной ссылкой на описание работы. это два

вы написали в этой ветке уже два комментария, так может напишете механизм подстановки const и вывода типа с указателями и const в шаблонах как это происходит в MQL? если возьмете в качестве примеров приведенные здесь коды с ошибками, будет вообще великолепно.

Причина обращения: