从构造函数初始化列表中的一对初始化

Initializing from a pair in constructur intializer list

我有一个函数 f 返回一对 classes AB:

的对象
auto f() -> std::pair<A,B>;

此外,我有一个 class CAB 作为成员:

class C {
  public:
    C();
  private:
    A a;
    B b;
};

C的构造函数中,我想使用成员初始化器列表并用f的输出进行初始化:

C(): a(f().first), b(f().second) {}

虽然这会调用 f 两次,但它是一个相当复杂的函数。 有没有一种方法可以在不调用 f 两次的情况下使用成员初始化列表来实现这一点?不幸的是,C 的内部结构无法更改。

一种可能的解决方案:

class C {
  public:
    C(std::pair<A,B>);
  private:
    ...
};

C(pair<A,B> p): a(p.first), b(p.second) {}

您现在只需调用 f 一次,只要它不与其他一些要求相矛盾,它就可以工作。

改进 的想法:

class C
{
    A a;
    B b;
    
    C(std::pair<A,B> &&pair) : a(std::move(pair.first)), b(std::move(pair.second)) {}

  public:
    C() : C(f()) {}
};