【发布时间】:2015-03-08 12:39:32
【问题描述】:
我有以下代码:
#include <iostream>
#include <utility>
class A {
public:
A() { }
A(const A&, int i) { std::cout << "A copy" << std::endl; }
A(A&&, int i) { std::cout << "A move" << std::endl; }
A(const A&) = delete;
A(A&&) = delete;
};
class B : public A {
public:
B(int i) { std::cout << "B construct" << std::endl; }
B(const A& a) : A(a, 1) { std::cout << "B copy" << std::endl; }
B(A&& a) : A(std::move(a), 1) { std::cout << "B move" << std::endl; }
};
B make_b() {
return B(1);
}
int main() {
B b = make_b();
}
编译器报错B不能被复制构造的错误(用于从make_b返回),因为它没有复制构造函数,因为A的复制构造函数被删除了。
-
B(const A&)不符合复制构造函数的条件,这里适用的规则是什么? - 复制和移动构造函数是否总是必须采用相同类型的一个参数(而不是超类)?
- 是否可以有带默认值的附加参数?
- 能否对其进行模板化以便解析为有效的复制构造函数?
- 要允许隐式复制和移动构造,是否需要显式添加复制和移动构造函数
B(const B&)和B(B&&)?
【问题讨论】:
-
注: C++ 中的正确术语是“基类”而不是超类。
标签: c++ class c++11 copy-constructor