将错误从链接时移动到编译时

时间:2012-05-07 02:33:34

标签: c++ hyperlink copy-constructor compile-time

我声明了一个类copy-ctoroperator= 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

1 个答案:

答案 0 :(得分:2)

因为违反语言的语义是编译时错误,而链接时错误是由声明的函数引起的错误,但链接器无法找到它的定义。

换句话说,链接器错误意味着您的程序是一个有效的C ++程序,并且已经进入链接阶段,其中链接器只是修补对其他编译单元中的函数的引用(因为编译器只考虑一个编译单元)时间)但它已遍布各地,无法找到定义。编译时错误意味着您的程序以某种方式违反了C ++的规则。

然而,您的假设有点不正确。使operator= private 会导致尝试分配这些对象的人员出现编译时错误。只有当有权访问该类的私有函数的函数(例如friend函数或成员函数)然后时,才会出现链接器错误