cppcheck 是不是知道移动语义?

Posted

技术标签:

【中文标题】cppcheck 是不是知道移动语义?【英文标题】:Is cppcheck aware of move semantics?cppcheck 是否知道移动语义? 【发布时间】:2018-02-06 01:26:44 【问题描述】:

我正在编写一个或多或少看起来像这样的类

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

【讨论】:

我一直在寻找这个答案。我将在我当前的代码中禁止这个检查。 这应该是所有按值传递并立即移出的对象的情况。

以上是关于cppcheck 是不是知道移动语义?的主要内容,如果未能解决你的问题,请参考以下文章

可变引用是不是具有移动语义?

当基类提供时,派生类是不是需要实现移动语义?

一文入魂:再也不用担心我不懂C++移动语义了!

一文入魂:妈妈再也不用担心我不懂C++移动语义了!

首先创建字符串然后通过移动语义将其添加到向量或在向量中创建元素是不是具有内存效率?

右值引用,移动语义,完美转发