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

Ant*_*Ant 0 c++ move copy-constructor

假设我有这个代码:

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

AlterParam函数返回字符串的副本,因此当ConditionIsMet返回 true 时,会创建一个副本以填充 Maybe_altered_pa​​ram。然而,当ConditionIsMet(),这是次优的。在第二种情况下,我只想为同一个对象指定另一个名称,而不需要副本或任何类似的内容。

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

Sto*_*ica 6

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

你想要“用 Maybe_altered_pa​​ram 做一些事情”,那些你不想为每个分支重复的事情(因为 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

十分简单。仅当满足条件时才会创建额外的副本,并且我们所做的事情maybe_altered_param仅拼写一次,并由该参数参数化。

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