首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为没有数据成员和基类的类隐式声明复制构造函数。

为没有数据成员和基类的类隐式声明复制构造函数。
EN

Stack Overflow用户
提问于 2014-11-04 05:44:55
回答 2查看 84关注 0票数 0

Standarad N3797::12.8/8 [class.copy]说:

类X的隐式声明复制构造函数的形式为X::X(const &),如果 -每个X的直接或虚拟基类B都有一个副本构造函数,其第一个参数类型为const &或constructor &,以及 -对于属于类类型M(或其数组)的X的所有非静态数据成员,每个此类类类型都有一个副本构造函数,其第一个参数为const &或const volatile &。 否则,隐式声明的副本构造函数将具有表单X::X(X&)

我通过下面的示例尝试了这一点:

代码语言:javascript
复制
struct B
{
    B(){ }
    B(const B&){}
};

struct A : B
{
    A(){ };
};

const A a;

A t = a; //OK Lvalue reference to const A can be initialized with 
         //an lvalue of const A.

int main(){ }

演示

但是,如果我们从示例中删除class B,如下所示:

代码语言:javascript
复制
struct A
{
    A(){ };
};

const A a;

A t = a; //OK, Why?

int main(){ }

演示

它还是可以用的。但是由于复制构造函数应该有表单A::A(A&),所以我预计编译时会出现。实际上,如果我们编写以下代码:

代码语言:javascript
复制
struct A
{
    A(){ };
    A(A&){ };
};

const A a;

A t = a; //error: no matching constructor for initialization of 'A'

int main(){ }

演示

它会像我预期的那样工作。

那么第二个案子是个窃听器吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-04 05:46:51

在这两种情况下,隐式声明的复制构造函数都是表单A(const A &),因为这是列表中的第一种情况,不适用任何限制。

票数 0
EN

Stack Overflow用户

发布于 2014-11-04 10:01:25

正如T.C. 在评论中所指出的,需求可能是空的--也就是说,可能根本没有基类,并且仍然满足了第一个项目中的要求:

-每个直接或虚拟基类B of X都有一个副本构造函数,其第一个参数类型为const B&const volatile B&,以及

如果没有直接或虚拟基类,则此条件的计算结果为true --不要求至少有一个基类具有适当的副本构造函数,而是要求没有不满足要求的基类,即具有不属于给定形式的副本构造函数。如果这样做更清楚,你也可以改写案文:

-如果X有直接或虚拟基类,则每个直接或虚拟X基类B都有一个副本构造函数,其第一个参数为const B&const volatile B&类型,并且

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

https://stackoverflow.com/questions/26728495

复制
相关文章

相似问题

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