如何将引用绑定到 const 参数或新对象?

How to bind a reference to either a const param or a new object?

假设我有这个代码:

void MyFunc(const std::string& param) {
  std::string maybe_altered_param;
  if (ConditionIsMet()) {
    maybe_altered_param = AlterParam(param);
  } else {
    maybe_altered_param = param; // <-- unnecessary copy 
  }

  // do stuff with maybe_altered_param
  // maybe_altered_param does not need to be modified further.
}

AlterParam函数returns复制字符串,所以当ConditionIsMetreturns为真时,复制一份以填充maybe_altered_param . 但是,当 ConditionIsMet() returns false 时也会创建一个副本,这是次优的。在第二种情况下,我只想为同一个对象使用另一个名称,没有副本或任何类似的东西。

在这种情况下,删除不需要的副本的最简单方法是什么?

我认为你关于引用绑定的问题被误导了。它正在寻找本质上是代码组织问题的语言解决方案。

您想“用 maybe_altered_param 做一些事情”,您不想为每个分支重复的事情(因为 DRY 代码是最好的代码)。那么为什么不重构 那一点 呢?

static void MyFuncImpl(const std::string& maybe_altered_param) {
  // do stuff with maybe_altered_param
}

void MyFunc(const std::string& param) {
  if (ConditionIsMet()) {
    MyFuncImpl(AlterParam(param));
  } else {
    MyFuncImpl(param);
  }
}

简单易行。只有满足条件时才会进行额外的复制,而我们用 maybe_altered_param 所做的事情只会拼写一次,由该参数参数化。

可能不是你想要的答案,但我认为值得考虑。

有了额外的变量,你可以这样做:

void MyFunc(const std::string& param) {
    std::string maybe_altered_param;
    const bool condition_met = ConditionIsMet();
    if (condition_met) {
        maybe_altered_param = AlterParam(param);
    }
    const std::string& ref =
        condition_met ? maybe_altered_param : param; // both are lvalues, so no copy.
    // do stuff with ref
}