LINUX.ORG.RU

std::fill Move semantic

 


0

2

Показалось мну логичным, вот так в 4 строчки стартовать/стопать тредпул:

    auto tasks = make_shared<Queue>();
    std::vector<std::thread> pool(4);
    std::fill(pool.begin(), pool.end(), std::thread([=](){tasks->run();}));
    std::for_each(pool.begin(), pool.end(), [](thread& thread) {thread.join();});

Но, подлый std::fill кушает константную ссылку заместо rv ссылки. Так только в gcc? Wtf? Я что то не так готовлю?

Или это такой фейспалмненкий облом? Или есть логичное обьяснение почему не ввели перегрузку? Да хрен с ней с перегрузкой, хотя бы контракт, что если возможен move вызывается move. Кто то в курсе комитетовских дел?

Вобщем я возмущён и разочарован:(

★★★★★

std::fill() заполняет копией одного и того же элемента. То есть, если бы std::thread был копируемым, тебе бы один и тот же тред раскопировало на весь пул.

Тебе нужен std::generate() или что-то типа него:

std::generate(pool.begin(), pool.end(), []() {return std::thread([=](){tasks->run();});});

Deleted ()
Последнее исправление: Deleted (всего исправлений: 2)

по-хорошему, тебя надо уволить за такие извращения

у вектора есть fill-конструктор, который сделает то же самое в три строки. это раз. move-семантики нет, из-за унаследованной от c++98 строгой безопасности относительно исключений (на которую опираются миллионы строк уже написанного кода). это два.

anonymous ()
Ответ на: комментарий от Deleted

Да, была такая мысль, но чет мну уже в сон поклонило :)

Чет я нагнал наночь глядя. Спасибо.

pon4ik ★★★★★ ()

Ну ты конечно молодец что меня поругал, но ларчик проще открывается, там нельзя делать мув семантику, ибо как сказал товарищь выше - размножается копия одного и тогоже обьекта, соответственно его нельзя мувать.

pon4ik ★★★★★ ()
Ответ на: комментарий от pon4ik

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

anonymous ()

Тебе надо переквалифицироваться в управдомы. Или хотя бы в java-программисты. Кресты не для тебя.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.