我有一个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()的值,还是我最好编写两个单独的构造函数?
答案 0 :(得分:3)
为什么不做一些简单的事情-即重载构造函数?
struct B
{
B(A a) {
int n = a.f();
...
}
B(A a, int n) {
...
}
};
如果您不喜欢在...
中重复代码,则始终可以只调用一次私有成员函数,即可完成其余的构造。
答案 1 :(得分:1)
有更多可能的解决方案。
最简单的方法是使a
成为指针:
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(a, a.f()) {}
};
我不建议这种解决方案。指针是一种更清洁的方法。
编辑:
通过std :: move从实用程序库中移动
struct B
{
A&& a:
int n:
B(A&& a, int n): a(std::move(a)), n(n) {...}
B(A&& a): B(std::move(a), a.f()) {...}
};