I have a dumb question about the use of std_move. In 
BlockIO InterpreterInsertQuery::execute(): ln 312

https://github.com/ClickHouse/ClickHouse/blob/8ede5c736a6744f8daa6301d63697b8d4864725d/src/Interpreters/InterpreterInsertQuery.cpp#L310-L313

can this code block just written as 

```cpp
out_wrapper->setProcessListElement(context.getProcessListElement());
out_streams.emplace_back(std::move(out_wrapper););
```
or any specific reason?
out = std::make_shared<CheckConstraintsBlockOutputStream>(
                    query.table_id, out, out->getHeader(), metadata_snapshot->getConstraints(), getContext());
            bool null_as_default = query.select && getContext()->getSettingsRef().insert_null_as_default;
            
            
            out = std::make_shared<AddingDefaultBlockOutputStream>(
                out, query_sample_block, metadata_snapshot->getColumns(), getContext(), null_as_default);
            
            
            
            
            if (!(settings.insert_distributed_sync && table->isRemote()) && !no_squash && !query.watch)
            {
                bool table_prefers_large_blocks = table->prefersLargeBlocks();
                out = std::make_shared<SquashingBlockOutputStream>(
                    out,
                    out->getHeader(),
                    table_prefers_large_blocks ? settings.min_insert_block_size_rows : settings.max_block_size,
                    table_prefers_large_blocks ? settings.min_insert_block_size_bytes : 0);
            }
            auto out_wrapper = std::make_shared<CountingBlockOutputStream>(out);
            out_wrapper->setProcessListElement(getContext()->getProcessListElement());
            out = std::move(out_wrapper);
            out_streams.emplace_back(std::move(out));
        }
    }
    
    if (is_distributed_insert_select)
    {