gpt4 book ai didi

c++ - 将错误从链接时转移到编译时

转载 作者:行者123 更新时间:2023-11-28 03:37:19 25 4
gpt4 key购买 nike

我声明一个类的 copy-ctoroperator= private 以使其对象不可复制,并且不提供定义他们俩。因此,如果该类的 friends 在这些对象上调用复制行为,就会发生链接时错误,对吧?

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=是private的,所以这个会失败,error会上升,发生在compile-时间

我的问题是为什么这会发生在编译时

最佳答案

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

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

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

关于c++ - 将错误从链接时转移到编译时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10476031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com