根据其他参数委派构造函数和默认参数

Hel*_*sel 6 c++ constructor delegates

我有一个B的构造函数,有一些默认参数,取决于其他参数:

struct A
{
    int f();
    A(const A&) = delete;
    A(A&& );
    // ....
};

struct B
{
    B(A a, int n=a.f()) {//...}
    // ...
};
Run Code Online (Sandbox Code Playgroud)

这显然无法以这种方式工作,所以我想使用委托构造函数:

struct B
{
      B(A a, int n) {//...}
      B(A a): B(a, a.f()) {}
};
Run Code Online (Sandbox Code Playgroud)

但是,这也不起作用,因为删除了A的复制构造函数.所以我需要类似的东西

struct B
{
      B(A a, int n) {//...}
      B(A a): B(std::move(a), a.f()) {}
};
Run Code Online (Sandbox Code Playgroud)

据我所知,不能保证在std :: move之前评估af(),因此结果是未定义的.是否有可能在std :: move之前获取af()的值,或者我应该更好地编写两个单独的构造函数?

vik*_*kre 0

对此有更多可能的解决方案。

  1. 最简单的方法是创建a一个指针:

    struct B
    {
         B(A* a, int n) {...}
         B(A* a): B(a, a->f()) {}
    };
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更复杂的方法是尝试做a参考:

    struct B
    {
          B(A& a, int n) {...}
          B(A& a): B(a, a.f()) {}
    };
    
    Run Code Online (Sandbox Code Playgroud)

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

编辑:

  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()) {...}
    };
    
    Run Code Online (Sandbox Code Playgroud)