C++ 在函数签名中查找缺少的符号(&;)?

C++ 在函数签名中查找缺少的符号(&;)?,c++,C++,有大量代码,其中一些值可以&应该是常量引用,而不是副本。是否有任何工具可以帮助在代码中搜索这样的“缺失的符号”以帮助防止不必要的复制大大减慢过程?在复制构造函数中为复制和调试的对象放置断点。可能不是一种聪明的方法,您可以将类的副本删除,并确认所有编译错误。实际上不是这样,因为在某些地方您希望按值传递而不是按引用传递,而且工具不可能知道您的意图(它不是读心器)。如果您有一个应该始终通过引用传递的类型的小列表,那么这是可能的,但是没有办法创建一个通用工具。还要注意的是,如果你摆弄复制构造函数,你还必

有大量代码,其中一些值可以&应该是常量引用,而不是副本。是否有任何工具可以帮助在代码中搜索这样的“缺失的符号”以帮助防止不必要的复制大大减慢过程?

复制构造函数中为复制和调试的对象放置
断点。

可能不是一种聪明的方法,您可以将类的副本删除,并确认所有编译错误。

实际上不是这样,因为在某些地方您希望按值传递而不是按引用传递,而且工具不可能知道您的意图(它不是读心器)。如果您有一个应该始终通过引用传递的类型的小列表,那么这是可能的,但是没有办法创建一个通用工具。还要注意的是,如果你摆弄复制构造函数,你还必须考虑使用复制构造函数的所有其他地方(如变量定义或vale返回以及可能的其他地方)。在没有符号和的情况下搜索函数调用可能可以用正则表达式完成,但我在这方面做得不够好,无法提供它;-)如果您专门寻找常量引用,那么工具应该不太难检测到这样的情况:参数从未写入,因此可能是常量并由ref传递。例如,我相当肯定resharper在C#中也会进行类似的复杂代码分析(尽管这里的具体问题在C#-))。可以用lib-clang(或者可能用C-tag和regex)来完成。@kebs:算了吧。用正则表达式解析C++是不可能的。可能会带来很多错误的肯定,例如在变量初始化中使用复制初始化,或者函数返回值。@ JoaHixIbRig如果删除复制构造函数,但把移动构造函数放在适当的位置,那么多少假阳性会消失?(不会发现带有临时参数的pass-by-value调用,但我认为这是无害的)。这是非常聪明的imho。不应复制表示大量数据集合的某些类型。这只是因为你可以寻找符号,而不能Ctrl+F,因为缺少符号可能会给出很多误报,例如在带有复制初始化的变量定义中,或者对于按值返回的函数。当然,这只是一种快速的方法。顺便说一句,如果启用优化,许多副本将被删除哇!运行时检查似乎比编译时差得多。普通人,它是一种免费的虚拟方法,不需要外部工具。它不值得如此多的批评:D“在复制和调试对象的复制构造函数中设置断点”。然后确保您的程序在调试会话中处理所有可能的情况。。。。我会将copy-ctor设置为private,或者deleted,或者更好,如果编译器允许的话,然后检查copy-ctor的每一个实际使用情况,并评估该副本是否可以替换为const-reference@JoachimPileborg,不管怎样都要处理误报。