C++ 自动检测通过值传递给c+中函数的对象的方法+;

C++ 自动检测通过值传递给c+中函数的对象的方法+;,c++,C++,我和我的同事经常忘记通过引用传递(大型)对象,而是通过值传递。这可能会影响性能。在这种情况下,是否可以将编译器配置为警告我?是否可以在一组C++源文件中自动检测到它…也许是有人写过的正则表达式 更新: 谢谢你们的回答。所有答案的一个问题是它们只适用于我写的课程。。。不适用于现有类。。像std::vector。我可以对它们进行子类化,但如果只复制一个大对象私有的构造函数和操作符,那就太单调了。在QT中,他们为Q_DISABLE_COPY()创建了特殊的宏。您可以将类型的复制构造函数声明为priva

我和我的同事经常忘记通过引用传递(大型)对象,而是通过值传递。这可能会影响性能。在这种情况下,是否可以将编译器配置为警告我?是否可以在一组C++源文件中自动检测到它…也许是有人写过的正则表达式

更新:
谢谢你们的回答。所有答案的一个问题是它们只适用于我写的课程。。。不适用于现有类。。像
std::vector
。我可以对它们进行子类化,但如果只复制一个大对象私有的构造函数和操作符,那就太单调了。在QT中,他们为Q_DISABLE_COPY()创建了特殊的宏。

您可以将类型的复制构造函数声明为
private
——因为在按值传递对象时会调用复制构造函数,所以在任何按值传递的调用站点上,您的代码在编译时都会出错

如果编译器支持,您还可以使用新的
c++11
支持来删除不需要的构造函数/析构函数。查看详细信息

如果您确实需要在代码中使用copyctor,另一个选项是在copyctor中添加调试断点。然后,您可以逐步完成程序的调试构建,并检查何时调用copyctor

希望这有帮助

编辑:因为您希望在标准容器上检测复制ctor的使用,所以事情就不那么简单了。您可以尝试一些类似的方法,这是一种非常丑陋的黑客行为,通过一个带有禁用复制构造函数的包装类来委托所有
std::vector
实例

注意代码中的警告。我只会使用这种东西来识别你的传递值问题,然后将其删除-恢复到使用
std::vector
等的干净方式


如果要永久禁用标准容器的复制,可以编写自己的包装器类来封装(而不是继承)标准容器

一种方法是让重对象从类继承,如:

struct heavy {
    struct heavy_copy_ctor_invoked {};
    heavy(const heavy&) {
        typename boost::mpl::print<heavy_copy_ctor_invoked>::type _;
    }
};

struct foo : heavy { ...
struct-heavy{
调用{}的结构重拷贝向量;
重型(恒重型){
typename boost::mpl::print::type ;
}
};
结构foo:重{。。。

每次调用重载复制ctor时,mpl都会发出警告。

使用正则表达式肯定不是正确的工具。即使您可以识别未通过引用传递的参数,但如果不知道这些类型有多大,也没有帮助。我没有具体的答案,但我建议使用静态代码分析工具。您可以禁用它他在你的大对象上复制构造函数。有什么东西对现有类有效吗..比如
std::vector
?谢谢你的回答。我很感激。制作包装器是个好主意。但我想知道是否可以做一些不那么乏味的事