C++ 我可以禁用std::vector';复制构造函数是什么?

C++ 我可以禁用std::vector';复制构造函数是什么?,c++,c++11,stl,C++,C++11,Stl,我在写代码,里面有很多STL向量。我想我已经把它结构化了,所以它都是引用和移动构造函数,但我希望有一个自动化的方法来确保。每当调用复制构造函数时,是否有任何方法可以获得警告或错误 我不想编写自己的向量类,也不想修改STL头。请不要在编写自己的类的人提出的类似问题的副本上做标记:我不想这样做。除了禁用存储在向量中的复制构造函数和复制赋值运算符之外,不修改向量源代码,您将无法禁用向量副本 不过,您确实有一些选择 您可以检查二进制文件中是否存在向量复制构造函数;如果从未使用过,优化器应该将其删除 您可

我在写代码,里面有很多STL向量。我想我已经把它结构化了,所以它都是引用和移动构造函数,但我希望有一个自动化的方法来确保。每当调用复制构造函数时,是否有任何方法可以获得警告或错误


我不想编写自己的向量类,也不想修改STL头。请不要在编写自己的类的人提出的类似问题的副本上做标记:我不想这样做。

除了禁用存储在向量中的复制构造函数和复制赋值运算符之外,不修改向量源代码,您将无法禁用向量副本

不过,您确实有一些选择

您可以检查二进制文件中是否存在向量复制构造函数;如果从未使用过,优化器应该将其删除

您可以插入向量中包含的类型的复制构造函数,并查看调用它的频率

您可以在复制构造函数(或它调用的某个辅助函数)上放置断点,并在命中时检查调用堆栈,以查看是否是复制构造函数调用它


或者您可以使用自己的类临时包装vector,并删除其复制构造函数。

您可以创建一个从
vector
派生的类,并实现除复制构造函数之外的所有构造函数,而不是编写自己的
vector
类。然后您将
#定义向量my_vector

显然,这样做只是为了找到复制构造函数调用,然后应该注释掉这段代码。对于您自己的向量类,这应该只有50-100行而不是1k行。

您可以使用
std::unique\u ptr
,尽管间接寻址会有一点开销,并且许多
需要更改为
->
。这将有助于您在没有任何黑客攻击的情况下防止复制。

断点解决方案非常简单且易于使用implement@programmerjake:我想当你说
#define vector my_vector
:-)+1建议插入元素类型时,已经很清楚了。通过这种方式,您还可以了解您是否有不适当的重新分配。通过使用instrumentation包装器的move构造函数的
noexcept
属性,您可以有选择地分离出重新分配。当然,当代码使用时,其中一些涉及
值类型的方法不起作用,例如
std::vector
@aschepler:这就是为什么我给出了多种可能的方法。