委托构造函数和默认参数(取决于其他参数)

时间:2019-01-12 09:22:32

标签: c++ constructor delegates

我有一个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()的值,还是我最好编写两个单独的构造函数?

2 个答案:

答案 0 :(得分:3)

为什么不做一些简单的事情-即重载构造函数?

struct B
{
    B(A a) {
        int n = a.f();
        ...
    }
    B(A a, int n) {
        ...
    }
};

如果您不喜欢在...中重复代码,则始终可以只调用一次私有成员函数,即可完成其余的构造。

答案 1 :(得分:1)

有更多可能的解决方案。

  1. 最简单的方法是使a成为指针:

    struct B
    {
         B(A* a, int n) {...}
         B(A* a): B(a, a->f()) {}
    };
    
  2. 一种更复杂的方法是尝试将a用作参考:

    struct B
    {
          B(A& a, int n) {...}
          B(A& a): B(a, a.f()) {}
    };
    

我不建议这种解决方案。指针是一种更清洁的方法。

编辑:

  1. 通过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()) {...}
    };