Cppcheck знает о семантике перемещения?
Я пишу класс, который более или менее выглядит так
struct Foo {
std::shared_ptr<Bar> bar_ptr;
Foo(std::shared_ptr<Bar> b)
: bar_ptr(std::move(b)) {}
};
и cppcheck предупреждает
(производительность) Параметр функции 'b' должен быть передан по ссылке.
У меня сложилось впечатление, что в этом случае b
не должно быть какой-либо ссылки. Это позволило бы случаи Foo
опционально получить полный контроль над ресурсом (исходный общий указатель)
auto bar1 = std::make_shared<Bar>(...);
Foo my_foo(bar1); // bar1 remains untouched
Foo your_foo(std::move(bar1)); // takes complete control of the bar1
// resource; bar1 now invalid
Правильно ли я что-то использую, или cppcheck еще не знает об этом?
1 ответ
Решение
Я разработчик Cppcheck. Мне кажется, это ложный позитив, Cppcheck не должен предупреждать. Вероятно, мы не должны предупреждать о параметрах std::shared_pointer в каких-либо функциях. Я создал этот билет: http://trac.cppcheck.net/ticket/8400