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

 
Alexey Navoykov:

То что вы сказали, мол константа нигде не хранится, а создаётся на лету,  то это и означает, что она должна передаваться в виде r-value, а не l-value (в отличие C++).  Разницы принципиальной нет, в каком виде оно интерпретируется, главное чтобы можно было её принять в функции.

ну вообще-то r-value ссылка подразумевает наличие объекта для которого будет делаться перемещение. т.е. временный объект все равно надо создавать.

 
TheXpert:

ну вообще-то r-value ссылка подразумевает наличие объекта для которого будет делаться перемещение. т.е. временный объект все равно надо создавать.

Ну понятное дело, объект всегда где-то имеется. Я и написал, что этот объект создаётся на лету, т.е. временный.

Но я кажись понял, что спрашивал Слава.   Он имел ввиду, зачем принимать временный объект по ссылке, если можно принять по значению. 

Так вот дело в том, что перегружать функцию одновременно для ссылки и для значения невозможно в одном скопе:

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
}

что и делает проблематичным написание универсальных решений.  А заменив значение на r-value, получим рабочий вариант:

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

Он имел ввиду, зачем принимать временный объект по ссылке, если можно принять по значению.

потому что

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
}

и потому что по ссылке обычно передавать что-то удобнее чем по значению.

а если метод шаблонный (с чего собственно и пошла пьянка) то текущее поведение просто не дает нормально писать.

 
TheXpert:

а если метод шаблонный (с чего собственно и пошла пьянка) то текущее поведение просто не дает нормально писать.

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

что и делает проблематичным написание универсальных решений.  А заменив значение на r-value, получим рабочий вариант:

на самом деле нет )

move семантика предполагает указание перемещаемому объекту, что ему не надо удалять внутренности. если объект константный, потребуется mutable член класса, mql такого не поддерживает

 
TheXpert:

на самом деле нет )

move семантика предполагает указание перемещаемому объекту, что ему не надо удалять внутренности. если объект константный, потребуется mutable член класса, mql такого не поддерживает

Да, вы правы, const для r-value  не нужно было ставить (оно и не компилируется так в плюсах).   Сейчас поправлю )  
 

Зачем в mql5 move семантика? Тут не нужна такая оптимизация производительности, тем более это виртуалка. Для каких еще целей ее вводить?)

Сам по себе mql5 сильно отличается как от C++, так и от C++98, так и уж тем более от C++11/14/17, но его возможности сейчас полностью покрывают необходимые вещи для создания советника.

 
Andrey Pogoreltsev:

но его возможности сейчас полностью покрывают необходимые вещи для создания советника.

Они и 6 лет назад в старом MQL4 покрывали эти необходимости, если вы имеете представление, каков был уровень языка в те времена.  Мы писали на нём советники, а некоторые и до сих пор кодят в таком архаическом стиле.  Так что всё относительно.

Для каких еще целей ее вводить?)

Это обсуждалось последние пару страниц ветки.
 

Тут выдаёт ошибку:

void OnStart()
  {
   struct sA
     {
      int               ii[51];
     };
   struct sB
     {
      string            name;
      sA                distrib;
     };
   sB f;
  }
'distrib' - struct undefined    Test2.mq5       21      25

А так не выдаёт:

void OnStart()
  {
   struct sA
     {
      int               ii[51];
     };
   struct sB
     {
      //string            name;
      sA                distrib;
     };
   sB f;
  }

Так тоже не выдаёт:

struct sA
  {
   int               ii[51];
  };
struct sB
  {
   string            name;
   sA                distrib;
  };

void OnStart()
  {
   sB f;
  }

В прикрепленном файле скрипт для воспроизведения ошибки, пустой скрипт с парой строк кода что выше.

Файлы:
Test2.mq5  1 kb
 

Ну это совсем не логично:

class A
  {
   class B
     {
      class C
        {
         class D
           {
            class E
              {
               bool              YES;
              };
           };
        };
     };
  };
void OnStart()
  {
   E g;
  }

Класс E не заслуживает такой популярности.

Компилируется без ошибок.