将错误从链接时移动到编译时
move error from link-time to compile-time
我声明了一个类的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
的copy-ctor
和operator=
是私有的,所以这会失败,错误会上升,这发生在compile-time
。
我的问题是为什么会在compile-time
发生这种情况?
因为违反语言语义是编译时错误,而链接时错误是由于声明了函数但链接器找不到它的定义而导致的错误。
换句话说,链接器错误意味着您的程序是一个有效的C++程序,并且已经进入链接阶段,链接器只是修补对其他编译单元中函数的引用(因为编译器一次只考虑一个编译单元(,但它到处搜索并且找不到定义。编译时错误意味着您的程序以某种方式违反了C++规则。
但是,您的假设有点不正确。进行operator=
private
将导致尝试分配这些对象的用户出现编译时错误。唯一会收到链接器错误的情况是,当函数有权访问该类的私有函数(例如friend
函数或成员函数(时,您会收到链接器错误。
相关文章:
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- std::任何只用于移动的模板,其中副本ctor内的static_assert等于编译错误,但为什么
- 编译对移动应用的影响?
- 初始化不可移动对象数组:为什么这样的代码无法在 GCC 上编译?
- 程序编译,但当分解为函数时实际上不会移动电机
- 提升移动编译错误
- 为什么删除移动构造函数会导致编译错误
- 将函数从控制台应用程序移动到共享库项目似乎会带来不相关的编译错误
- Visual Studio 2017:_MM_LOAD_PS经常被编译为移动
- 在向量中使用派生的可移动但不可压缩的会导致编译错误
- libstdc++已弃用;移动到libc++[-Wdeprecated],但是更改会产生编译错误
- 如果将功能的非常简单的定义移动到.cpp,则编译时间的减少是多少
- 只需添加任何事情都不会导致编译错误(围绕std ::移动),为什么
- 使用 pimpl 移动类无法编译
- 在Visual Studio中,我不想提交我的Debug文件夹,但它中有dll文件,如果我移动它,项目将无法编译
- 将 Windows C++ 项目从 Qt4 移动到 5 会给出数百个看似无关的编译错误
- 将模板方法移动到派生中断编译
- 返回仅移动类型编译,即使复制构造函数不可用
- 将错误从链接时移动到编译时
- C++ 移动构造函数无法编译