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

move error from link-time to compile-time

本文关键字:移动 编译 链接 错误      更新时间:2023-10-16

我声明了一个类的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的复制对应方,但Uncopyablecopy-ctoroperator=是私有的,所以这会失败,错误会上升,这发生在compile-time

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

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

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

但是,您的假设有点不正确。进行operator= private将导致尝试分配这些对象的用户出现编译时错误。唯一会收到链接器错误的情况是,当函数有权访问该类的私有函数(例如friend函数或成员函数(时,您会收到链接器错误。