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

Другие вопросы по тегам