我正在使用 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
的误解。我在某种程度上将编译时与运行时语义混为一谈:所有权不是由某些编译时魔法传递的,而是在运行时通过调用“复制”构造函数传递的。
答案 0 :(得分:2)
当您可以通过引用传递并分摊其中一个副本时,它已正确检测到您正在通过值传递给复制构造函数。您的优化人员几乎肯定会解决问题&#39;对你而言,没有必要依赖它。
我会说你的表达式在auto_ptr的情况下更可取,因为它告诉调用者你正在使用指针,但是我会说核心问题实际上是auto_ptr是一个坏公民(可以通过复制操作保持无效状态),这就是它被弃用的原因。