【发布时间】:2014-11-04 05:44:55
【问题描述】:
标准N3797::12.8/8 [class.copy] 说:
类 X 的隐式声明的复制构造函数将具有 形式 X::X(const X&) if
——X 的每个直接或虚拟基类 B 都有 第一个参数类型为 const B& 或 const 的复制构造函数 易变的 B& 和
——对于 X 的所有非静态数据成员 类类型 M(或其数组),每个这样的类类型都有一个副本 第一个参数类型为 const M& 或 const 的构造函数 不稳定的并购。
否则,隐式声明的复制构造函数将具有以下形式
X::X(X&)
我通过以下示例进行了尝试:
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,如下所示:
struct A
{
A(){ };
};
const A a;
A t = a; //OK, Why?
int main(){ }
它仍然可以正常工作。但是由于复制构造函数应该具有A::A(A&) 的形式,我预计会发生编译时。实际上,如果我们编写如下代码:
struct A
{
A(){ };
A(A&){ };
};
const A a;
A t = a; //error: no matching constructor for initialization of 'A'
int main(){ }
它会像我预期的那样工作。
那么第二种情况是bug吗?
【问题讨论】:
标签: c++ constructor