0

我声明了一个类copy-ctoroperator= private使其对象不可复制,并且不为它们提供定义。所以如果类在这些对象上friends调用,就会发生错误,对吧?copying behaviorlink-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'copy-ctoroperator=是私有的,所以这会失败并且会出现错误,这会发生在compile-time.

我的问题是为什么会发生这种情况compile-time

4

1 回答 1

2

因为违反语言语义是编译时错误,而链接时错误是由于声明了函数但链接器找不到它的定义而导致的错误。

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

但是,您的假设有点不正确。对试图分配这些对象的人来说,这样做operator= private 会导致编译时错误。只有当一个函数可以访问该类的私有函数(例如friend函数或成员函数)时,才会出现链接器错误,然后您会得到链接器错误。

于 2012-05-07T02:38:02.733 回答