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

 
Alexey Navoykov:

Как вы смотрите на то, чтобы добавить в язык возможность передачи аргумента как r-value?   Это сразу решит все вопросы и позволит создавать универсальные контейнеры для любых типов.

как? ) для универсальных контейнеров нужны ссылки и стрелки а не вот это вот все.

да и средний юзер здесь не тот, чтобы r-value делать.

 
Alexey Navoykov:

Как вы смотрите на то, чтобы добавить в язык возможность передачи аргумента как r-value?   Это сразу решит все вопросы и позволит создавать универсальные контейнеры для любых типов.  Вот в частности указанный выше метод  будет перегружен для r-value:

Именно так и реализовано во всех STL-контейнерах.

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

Каков тогда смысл в передаче параметра по ссылке?

 
Slava:

Каков тогда смысл в передаче параметра по ссылке?

вы очень странные вопросы задаете. r-value ссылки нужны исключительно для move семантики. обычные ссылки для всего остального.
 
Slava:

Каков тогда смысл в передаче параметра по ссылке?

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

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

 
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  не нужно было ставить (оно и не компилируется так в плюсах).   Сейчас поправлю )  
Причина обращения: