1 frag / 2 deaths
> Но в коде так и делается же.
Нет, не так. Одно дело когда ты перемещаешь юник, который в принципе скопировать нельзя, и другое, когда появляется возможность для копирования какого-нибудь std::string.
З.Ы.
Да и дело в сущности не в этом, а в самой необходимости отвлекаться от текущей работы и тратить его на какие-то бесполезные споры.
totoro
Подвох в том что можно забыть сделать мув и тогда стринг молча скопируется? Ну && поставь в декларации
totoro
> другое, когда появляется возможность для копирования какого-нибудь std::string
Породить от std::string свой класс(nocopy_string : public std::string), у которого конструктор копирования явно запретить.
1 frag / 2 deaths
> Ну && поставь в декларации
Есть нюансы, как сказал бы роннико - шо твориться?! :)
totoro
> Да на здоровье, что в этом коде не так?
> https://godbolt.org/z/faq4xoGTv
да, надо помозговать
Aroch
> каждое видео +/- часик, на месяц другой хватит посмотреть
> https://www.youtube.com/@CppCon/videos
спасибо
/A\
> Сравнение signed и unsigned...
Спасибо
pahaa
> - порядок вызова конструкторов/деструкторов при множественном виртуальном/невиртуальном
спасибо
Aroch
> теперь повесь фильтрацию, с пропуском первых двух элементов и последних 5, с группировкой по 4 штуки.
std::vector<T> grp; grp.reserve (4); for ( int i = 2, n = vec.size( ) - 5; i < n; i++) { T item = vec[i]; // или T &, если жаба душид if ( !filter_predicate( item)) continue; grp.push_back( item); if ( grp.size( ) >= 4) { ... // что мы там хотим делать с группой grp.clear( ); } }
Лютой необходимости в итераторах пока по-прежнему не наблюдаю.
Sbtrn. Devil
> n = vec.size() - 5
Ты забыл что эти дебилы сделали size беззнаковым. Что будет дальше - догадаешься?
1 frag / 2 deaths
> Что будет дальше - догадаешься?
приведется к int, он же в вычислениях.
Sbtrn. Devil
итого мы получили не эффективную реализацию с копированиями на ровном месте.
сравни с:
namespace vs = std::views; std::vector<int> data_array = {1,4,6,7,8,3,2,8,9,2,43,10,32,25}; auto filter_func = [](const auto& value) -> bool { return value > 5; }; auto sub_array = std::span( data_array).subspan( std::min( 2z, std::ssize( data_array)), std::max( 0z, std::ssize( data_array) - 7z)); for( const auto& chunk : sub_array | vs::filter( filter_func) | vs::chunk( 4)) { for ( int pos{}; const auto& value : chunk) std::print( "{}{}", ( pos++ ? ", " : ""), value); std::println( ""); }
Aroch
> приведется к int, он же в вычислениях.
А что приведётся?
1 frag / 2 deaths
> А что приведётся?
vec.size() - 5 результат вычисления будет int и поскольку он присваивается к n который также int то потери знака не будет.
Aroch
> приведется к int
чё вдруг-то?
uint - uint -> uint
Aroch
> результат вычисления будет int
результат вычисления будет приведён к int
в конкретно данном случае это overflow и UB
несмотря на то, что реализации всё же делают то, что от них хочется
pahaa
> uint - uint -> uint
с каких пор 5 это uint? :) Ты путаешь с 5u
> overflow и UB
только если размер вектора будет больше максимального int.
Aroch
> с каких пор 5 это uint? :) Ты путаешь с 5u
справедливо
тогда всё по-другому
кстати, то, что вот эта математика такая сложная и без 100 грамм не разобраться - это очень плохо, один из реальных недостатков плюсов
Aroch
> vec.size() - 5 результат вычисления будет int и поскольку он присваивается к n который также int то потери знака не будет.
Да, старший бит будет взведён, согласен, тут ничено не рванёт
Тема в архиве.