我可以禁用std :: vector copy构造函数吗?

时间:2014-08-22 19:11:07

标签: c++ c++11 stl

我正在编写包含大量STL向量的代码。我想我已经构建了它,所以它都是引用和移动构造函数,但我想要一种自动化的方法来确定。有没有办法在调用复制构造函数时获得警告或错误?

我不想编写自己的矢量类,也不想修改STL标头。请不要在撰写自己的课程时将这些类似问题的副本标记为:我不想这样做。

3 个答案:

答案 0 :(得分:8)

除了禁用存储在向量内的类型的复制构造函数和复制赋值运算符之外,没有你不能在不修改向量源代码的情况下禁用向量副本。

但是你有几个选择。

您可以检查二进制文件中是否存在向量复制构造函数;如果没有使用优化器应该消除它。

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

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

或者你可以用你自己的类临时包装vector,并删除它的拷贝构造函数。

答案 1 :(得分:2)

而不是编写自己的vector类,您可以创建一个派生自vector的类,并实现除复制构造函数之外的所有构造函数。然后你会#define vector my_vector。 显然这应该只是找到复制构造函数调用,然后应该注释掉这段代码。对于你自己的矢量类,这应该只有50-100行而不是1k行。

答案 2 :(得分:2)

您可以使用std::unique_ptr<std::vector>,虽然间接会有一点点开销,但很多.需要更改为->。这将有助于您防止在没有任何黑客攻击的情况下进行复制。