我声明了一个类copy-ctor
和operator=
private
来使其对象不可复制,并且不为它们提供定义。因此,如果班级friends
在这些对象上调用copying behavior
,则会发生link-time
错误,对吧?
class A
{
public:
...
private:
A(const &a);
A& operator=(const &a); //just declarations, no definitions
};
但是为了将错误从link-time
移到compile-time
,我从一本书中了解到我可以做到这一点:
class UnCopyable
{
public:
...
private:
Uncopyable(const &u);
Uncopyable& operator=(const &u); //also no definitions
};
然后让A
继承Uncopyable
,
class A: private Uncopyable
{
...
};
它在书中说,如果有人在A
上调用复制,那么A
应首先调用Uncopyable
复制对方,但Uncopyable
的{{1}} 1}}和copy-ctor
是私有的,因此会失败并且错误会上升,这会发生在operator=
。
我的问题是为什么会出现在compile-time
?
答案 0 :(得分:2)
因为违反语言的语义是编译时错误,而链接时错误是由声明的函数引起的错误,但链接器无法找到它的定义。
换句话说,链接器错误意味着您的程序是一个有效的C ++程序,并且已经进入链接阶段,其中链接器只是修补对其他编译单元中的函数的引用(因为编译器只考虑一个编译单元)时间)但它已遍布各地,无法找到定义。编译时错误意味着您的程序以某种方式违反了C ++的规则。
然而,您的假设有点不正确。使operator=
private
会导致尝试分配这些对象的人员出现编译时错误。只有当有权访问该类的私有函数的函数(例如friend
函数或成员函数)然后时,才会出现链接器错误