[C++11: 12.8/7]:
如果类定义没有显式地声明一个拷贝构造函数,那么它是隐式声明的。 如果类定义声明移动构造函数或移动赋值运算符,则隐式声明的复制构造函数被定义为删除; 否则,它被定义为默认(8.4)。如果类具有用户声明的复制赋值运算符或用户声明的析构函数,则不推荐使用后一种情况。因此,对于类定义[C++ 11:12.8/7]有意义吗?struct X { X(const X&, int); };
复制构造函数是隐式声明的。如果用户声明的构造将在后面定义为
X::X(const X& x, int i =0) { /* ... */ }
然后任何使用
X
的拷贝构造是形成不良的,因为歧义的;不需要诊断。
这对我没有多大意义。
“由此”引入的代码示例与我以斜体突出显示的“后一种”情况有什么关系?
我的理解至今是:
- 如果类定义不明确声明拷贝构造函数,
- 类定义不声明移动构造函数或移动赋值操作符和
- 该类有一个声明用途的拷贝赋值操作符或一个用户声明的析构函数,然后
- 隐式定义的拷贝构造函数被定义为
default
ed,并且这已被弃用。
这似乎本身就奇怪,一个标准的授权行为相提并论—弃用—。这是否意味着拥有满足这三个条件的班级已被弃用?
代码示例与它有什么关系?该构造函数不是复制构造函数,移动构造函数,移动赋值运算符,复制赋值运算符或用户声明的析构函数;它只是一个用户声明的构造函数,不是吗?这个“模糊”在哪里?
有人能为我解码这段经文吗?
我更加困惑于函数定义中的默认参数。 – 2012-01-13 11:46:40
是的,这似乎是一个奇怪的例子,在一个已经很奇怪的段落。 – 2012-01-13 11:47:30
@SimonRichter你可以将它们放在声明或定义中,但不能同时放在两者中。我自己,我从来没有把它放在定义中...... – 2012-01-13 11:49:44