> Мне вот интересно в какой версии C++ конструктор string'а станет наконец-то constexpr…
Если вы знаете, как сделать constexpr-конструктор для класса, владеющего памятью на куче, срочно оформляйте proposal! Это же столько дряни в компайл-тайм перетечет!
Класс будет неявно создавать перемещающий конструктор/оператор присвоения только в случае, если у класса не переопределены копирующий конструктор/оператор присвоения или деструктор. А их как правило переопределяют для нетривиальных классов.
> но что бы это понять и убедиться что это работает, нужно столько сил и времени
Просто: потому что copy elision 1. и так реализован в основных компиляторах 2. является требованием с++17.
> В итоге имеем такие затыки через каждые 20 строчек
Вот когда замерите, увидите что у вас программа 30+% времени перегоняет пустое в порожнее, туда-обратно копирует и жрет оперативку как хром, тогда у вас будет замечательный инструментарий в виде lvalue reference/rvalue/copy elision для оптимизации копирования и использования памяти. А заниматься микрооптимизациями, да еще и без четкого понимания как это всё работает — вредить себе и проекту.
Почему же трудно то?
template std::enable_if_t<std::is_same<std::random_access_iterator_tag, typename T::iterator_category>::value,void>
doSomething(T begin, T end) { /*...*/ }
Вот вам и ограничение «здесь принимается random access iterator».
Шаблонность в общем случае тоже необязательно — можно пользоваться auto функциями/лямбдами
есть функция std::distance, который как раз выдаст длину контейнера, определяемого итераторами begin и end. Точно так же у большинства контейнеров определен конструктор, принимающий итераторы и возвращающий, по факту, подмассив указанного размера: std::wstring ws = L«sometext»; std::string s(ws.begin()+4, ws.end()); вернет «text»
проблема в том, что некоторые неблагородные API (и майкрософт грешит этим чаще остальных) часто просят, например, wchar_t* вместо const wchar_t* даже когда не меняют строку.
когда Qt говорит «it could not find or load the Qt platform plugin» это обычно означает, что приложение не может найти нужную библиотеку в папке platforms проекта. Либо для этой библиотеки не разрешены зависимости
наверное, не совсем «ортогональны», если «дополняют друг друга»? 90% задач можно сделать и на том, и на другом. А остальные 10% тоже, только если пришивать ухо вместо хвоста ослику Иа
Вы не поняли суть процитированного вами же высказывания. Код на ФП не является более корректным только потому, что он функциональный. И точно так же он (в общем случае, не рассматривая конкретные задачи) не является по умолчанию более простым или безопасным.
При этом пара утверждений однозначно верны:
1. Реальные объекты имеют состояния и эти состояния могут меняться с течением времени.
2. Реальные данные имеют свойство меняться с течением времени.
Т.о. получается, что все задачи динамики (завязанные на времени) являются по своей природе императивными. Т.е. класс «чисто функциональных» задач очень скуден.
Из чего мы приходим к выводу, что имеет смысл внедрять элементы ФП в мультипарадигменные языки для упрощения анализа статики, но при этом чисто функциональные яп не применимы к большинству реальных задач.
Если вы знаете, как сделать constexpr-конструктор для класса, владеющего памятью на куче, срочно оформляйте proposal! Это же столько дряни в компайл-тайм перетечет!
Просто: потому что copy elision 1. и так реализован в основных компиляторах 2. является требованием с++17.
> В итоге имеем такие затыки через каждые 20 строчек
Вот когда замерите, увидите что у вас программа 30+% времени перегоняет пустое в порожнее, туда-обратно копирует и жрет оперативку как хром, тогда у вас будет замечательный инструментарий в виде lvalue reference/rvalue/copy elision для оптимизации копирования и использования памяти. А заниматься микрооптимизациями, да еще и без четкого понимания как это всё работает — вредить себе и проекту.
template std::enable_if_t<std::is_same<std::random_access_iterator_tag, typename T::iterator_category>::value,void>
doSomething(T begin, T end) { /*...*/ }
Вот вам и ограничение «здесь принимается random access iterator».
Шаблонность в общем случае тоже необязательно — можно пользоваться auto функциями/лямбдами
— Нет, явно недостаточно, и меня это беспокоит
При этом пара утверждений однозначно верны:
1. Реальные объекты имеют состояния и эти состояния могут меняться с течением времени.
2. Реальные данные имеют свойство меняться с течением времени.
Т.о. получается, что все задачи динамики (завязанные на времени) являются по своей природе императивными. Т.е. класс «чисто функциональных» задач очень скуден.
Из чего мы приходим к выводу, что имеет смысл внедрять элементы ФП в мультипарадигменные языки для упрощения анализа статики, но при этом чисто функциональные яп не применимы к большинству реальных задач.
например, создавать копию гигабайтного массива на каждое изменение элемента по отдельному индексу?