【发布时间】:2019-01-12 09:22:32
【问题描述】:
我有一个 B 的构造函数,带有一些默认参数,具体取决于其他参数:
struct A
{
int f();
A(const A&) = delete;
A(A&& );
// ....
};
struct B
{
B(A a, int n=a.f()) {//...}
// ...
};
这显然不能以这种方式工作,所以我想使用委托构造函数:
struct B
{
B(A a, int n) {//...}
B(A a): B(a, a.f()) {}
};
但是,这也不起作用,因为 A 的复制构造函数被删除了。所以我需要类似的东西
struct B
{
B(A a, int n) {//...}
B(A a): B(std::move(a), a.f()) {}
};
然而,据我所知,不能保证 a.f() 在 std::move 之前被评估,所以结果是未定义的。是否有可能在 std::move 之前获得 a.f() 的值,还是我应该更好地编写两个单独的构造函数?
【问题讨论】:
-
为了简单的生活,你不能在
Aprotected中创建复制构造函数吗? -
我可以。这只是一个简化版本,以显示问题的本质;实际情况其实更复杂。
标签: c++ constructor delegates