通过值

时间:2016-08-08 10:03:02

标签: c++ auto-ptr cppcheck

我正在使用 Cppcheck 1.75检查我的一个项目,并为此代码(为清晰起见而减少):

class TJob
{
public:
    TJob(std::auto_ptr<ITask> task);
    // ...
private:
    std::auto_ptr<ITask> m_task;
};

TJob::TJob(
    std::auto_ptr<ITask> task // <-- HERE the performance warning
    ): m_task(task)
{
    trace("TJob ctr");
}

我收到了这个新的效果警告:

  

Id:passedByValue

     

总结:函数参数'task'应该通过引用传递。

     

消息:参数'task'按值传递。它可以作为(const)引用传递,通常更快并且在C ++中推荐。

这显然是误报。在我看来这是一个错误,因为遵循这个建议导致严重的错误 [1] ,但也许有一个我错过设置的开关,或者我可以提供的一些模板来声明所有权通过<{1}}传递

我在网上搜索了这个,到目前为止我发现的唯一一个是Cppcheck包含Check for invalid usage of STL的一些检查,例如

auto_ptr

我知道,- using auto pointer (auto_ptr) 不是最佳选择,但与auto_ptr不一样吗?难道这两个检查会干扰吗?

除了使用inline supression之外,是否可以取消对这些情况的警告?

编辑:添加了脚注。
[1] 没有严重错误 ,只是对使用unique_ptr的误解。我在某种程度上将编译时与运行时语义混为一谈:所有权不是由某些编译时魔法传递的,而是在运行时通过调用“复制”构造函数传递的。

1 个答案:

答案 0 :(得分:2)

当您可以通过引用传递并分摊其中一个副本时,它已正确检测到您正在通过值传递给复制构造函数。您的优化人员几乎肯定会解决问题&#39;对你而言,没有必要依赖它。

我会说你的表达式在auto_ptr的情况下更可取,因为它告诉调用者你正在使用指针,但是我会说核心问题实际上是auto_ptr是一个坏公民(可以通过复制操作保持无效状态),这就是它被弃用的原因。