http://eel.is/c++draft/class.copy.elision#:constructor,copy,elision
Some quote:
> Speaking of RVO, return std::move(w); prohibits it. It means "use move constructor or fail to compile", whereas return w; means "use RVO, and if you can't, use move constructor, and if you can't, use copy constructor, and if you can't, fail to compile."
There is one exception to this rule:
```cpp
Block FilterBlockInputStream::removeFilterIfNeed(Block && block)
{
if (block && remove_filter)
block.erase(static_cast<size_t>(filter_column));
return std::move(block);
}
```
because references are not eligible for NRVO, which is another rule "always move rvalue references and forward universal references" that takes precedence.
Before adding this ignore you would receive the following when using GCC
7.3.1:
[ 82%] Building CXX object dbms/src/Storages/System/CMakeFiles/clickhouse_storages_system.dir/StorageSystemAsynchronousMetrics.cpp.o
In file included from /ClickHouse/dbms/src/Storages/System/StorageSystemAsynchronousMetrics.cpp:5:0:
/ClickHouse/dbms/src/Columns/ColumnString.h: In member function ‘virtual DB::BlockInputStreams DB::StorageSystemAsynchronousMetrics::read(const Names&, const DB::SelectQueryInfo&, const DB::Context&, DB::QueryProcessingStage::Enum&, size_t, unsigned int)’:
/ClickHouse/dbms/src/Columns/ColumnString.h:96:45: error: ‘*((void*)&<anonymous> +8)’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
const size_t size_to_append = s.size() + 1;
~~~~~~^~
cc1plus: all warnings being treated as errors
make[2]: *** [dbms/src/Storages/System/CMakeFiles/clickhouse_storages_system.dir/build.make:63: dbms/src/Storages/System/CMakeFiles/clickhouse_storages_system.dir/StorageSystemAsynchronousMetrics.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:9105: dbms/src/Storages/System/CMakeFiles/clickhouse_storages_system.dir/all] Error 2
make: *** [Makefile:163: all] Error 2