2012-01-13 25 views
4

[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,并且这已被弃用

这似乎本身就奇怪,一个标准的授权行为相提并论—弃用—。这是否意味着拥有满足这三个条件的班级已被弃用?

代码示例与它有什么关系?该构造函数不是复制构造函数,移动构造函数,移动赋值运算符,复制赋值运算符或用户声明的析构函数;它只是一个用户声明的构造函数,不是吗?这个“模糊”在哪里?

有人能为我解码这段经文吗?

+0

我更加困惑于函数定义中的默认参数。 – 2012-01-13 11:46:40

+0

是的,这似乎是一个奇怪的例子,在一个已经很奇怪的段落。 – 2012-01-13 11:47:30

+0

@SimonRichter你可以将它们放在声明或定义中,但不能同时放在两者中。我自己,我从来没有把它放在定义中...... – 2012-01-13 11:49:44

回答

3

这是否意味着满足这三个条件的类已被弃用?

是的;如果您有使用声明的复制赋值运算符或析构函数,则还应该声明复制构造函数。基本上只是说你的班级应该遵循Rule of Three(或5,或者其他所谓的C++ 11)。

这似乎很奇怪,标准规定的行为是 - 在相同的呼吸 - 不赞成使用。

该行为由标准强制规定,因为那是C++ 03中的行为 - 更改它会破坏遗留代码。正如标准定义(例如)动态异常规范的行为一样,并且也将其弃用。

“由此”引入的代码示例与我以斜体突出显示的“后一种”情况有什么关系?

它与“后者”案没有任何关系。

这是由子句定义的正常行为引起的潜在问题的说明:隐式声明的复制构造函数与用户声明的构造函数之间会存在冲突,并且可能会调用默认参数像复制构造函数一样。

这是什么“模棱两可”?

考虑代码:

X x1; // assume there's also a default constructor 
X x2(x); 

应该x2与用户声明的构造(与第二个参数取默认值)时被初始化,或隐式声明的拷贝构造函数?两者对使用情况同样适用。这是含糊不清的。

+0

谢谢;细分。 :)标准段落中应该有更多的换行符,methinks。 – 2012-01-13 12:10:14

3

只是回答第二部分。含糊不清是由于缺省参数int i = 0,它允许只使用第一个参数const X& x来调用构造函数,这允许它也可以用作复制构造函数,因为它与X(const X& x)(§12.8/ 2确切的文字)。这与隐式拷贝构造函数冲突,因此含糊不清。

+0

现在我感觉有点无聊。 – 2012-01-13 11:46:34

2

它似乎是澄清移动构造函数的作用以及它如何影响复制构造函数。这是说如果你声明一个移动构造函数或一个移动赋值操作符,那么将不会有隐式拷贝构造函数。如果你已经定义了你自己的拷贝构造函数或拷贝赋值操作符,你可以忽略你放在黑体文本中的位。

我觉得示例的重点是要表明,该类:

struct X { 
    X(const X&, int); 
}; 

拷贝构造函数隐含定义,因为没有用户定义拷贝构造函数。但是,如果你提供第二个int参数的默认值(因为他们已经完成),然后一个电话:

X newX(oldX); 

可能是用户定义的构造函数或拷贝构造函数的调用:这是含糊不清他们谈到。

+0

哦,因为默认的参数。杜对我。 – 2012-01-13 11:46:21

+0

@LightnessRacesinOrbit哦,至少那是简单的事情。 – 2012-01-13 11:49:21

+0

“用户定义的构造函数或复制构造函数”< - 不明确。两者都是复制构造函数。 – 2012-01-13 18:20:21