首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除复制构造函数或复制赋值操作符是否等于“已声明的用户”?

删除复制构造函数或复制赋值操作符是否等于“已声明的用户”?
EN

Stack Overflow用户
提问于 2015-03-10 12:20:09
回答 2查看 1.4K关注 0票数 6

按照这份报告,如果复制构造函数或复制赋值操作符是“用户声明的”,则不会生成隐式移动操作。复制构造函数或复制赋值操作符的delete是否算作“用户声明”?

代码语言:javascript
运行
复制
struct NoCopy {
    NoCopy(NoCopy&) = delete;
    NoCopy& operator=(const NoCopy&) = delete;
};

是否会为NoCopy类生成隐式移动操作?还是删除相关的副本操作意味着“用户声明”,从而抑制隐式移动生成?

如果可能的话,我更喜欢引用标准相关部分的答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-10 12:28:47

根据演示文稿的幻灯片14,删除的副本构造函数是“用户声明的”,从而抑制了移动生成。

票数 7
EN

Stack Overflow用户

发布于 2015-03-10 13:56:56

“用户声明”一词在标准中没有正式的定义。在特殊成员函数的上下文中,它是与“隐式声明”相反的。dcl.fct.def.default/4可以更清楚地说明这一事实,但其意图是:

显式默认函数和隐式声明函数统称为默认函数,实现应为它们提供隐式定义(12.1,12.4,12.8),这可能意味着将它们定义为已删除。一个特殊的成员函数是用户提供的,如果它是用户声明的,并且在第一个声明中没有显式的默认或删除。用户提供的显式默认函数(即,在其第一次声明后显式默认)将在显式默认的位置定义;如果此函数被隐式定义为已删除,则程序的格式不正确。

NoCopy(NoCopy&) = delete;NoCopy& operator=(const NoCopy&) = delete;都是特殊成员函数的声明。由于您是显式声明它们,而不是允许编译器隐式声明它们,所以它们是用户声明的。因此,这些声明将抑制move构造函数的隐式声明,并按照class.Copy/9移动赋值操作符:

如果类X的定义没有显式声明移动构造函数,则将隐式声明为defaulted当且仅当 - X没有用户声明的复制构造函数, - X没有用户声明的副本赋值操作符, - X没有用户声明的移动赋值操作符, - X没有用户声明的析构函数,并且 -移动构造函数不会被隐式定义为已删除。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28963577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档