简而言之:有没有什么方法可以修改类定义,使其在复制构造函数的使用点处无法编译,无论它在何处使用?
我有一个非常大的项目,正在清理一些类定义。有一个类我明确不想使用复制构造函数(让我们忽略为什么这是为了讨论),为了安全起见,我想我只是将复制构造函数定义为私有(private)而不是实际上实现它......如果我试图在任何地方使用它,它会抛出一个编译错误。瞧,它编译得很好,但我有一个链接器错误......找不到复制构造函数实现!大概这意味着它在某处使用,但我无法找到它的使用位置。顺便说一句,这是 Visual Studio 2010。所以我的问题是,有没有什么方法可以修改类定义,使其在使用时无法编译?
class Sample {
private:
// not implemented
Sample( const Sample& rhs );
Sample& operator=( const Sample& rhs );
public:
// implemented
Sample();
...
};
Sample *samp1 = new Sample;
Sample *samp2 = new Sample( *samp1 ); // <<-- inaccessible here! this works
大概因为我没有遇到编译错误,但遇到了链接器错误,这意味着类本身(或 friend )正在执行复制构造的创建(因为这就是可以访问私有(private)构造函数),但我肯定找不到它!
最佳答案
在 C++11 中,您可以将定义更改为
class Sample {
private:
// not implemented
Sample( const Sample& rhs ) = delete;
Sample& operator=( const Sample& rhs ) = delete;
public:
// implemented
Sample();
...
};
在 C++11 之前,这通常是通过继承一个声明私有(private)复制构造函数的类来完成的,例如 boost::NonCopyAble (你可以简单地复制这个类,它只有几行)。在这种情况下,您的类(class)(或任何 friend 或 child )也无法访问复制构造函数,并且会产生编译时错误。
关于c++ - 如何通过编译错误找到 C++ 复制构造函数的使用位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9037330/