c++ - 对临时对象的常量引用

标签 c++ implementation idioms

假设有这样一个函数

void SendToTheWorld(const Foo& f);

我需要在发送前预处理Foo对象

X PreprocessFoo(const Foo& f)
{
   if (something)
   {
      // create new object (very expensive).
      return Foo();
   }

   // return original object (cannot be copied)
   return f;
}

用法

Foo foo;
SendToTheWorld(PreprocessFoo(foo));

因此 X PreprocessFoo() 函数应该能够返回原始对象或复制/修改,而​​不是返回新对象。我不能返回 const Foo& 因为它可能引用一个临时对象。我也不喜欢在堆上创建 Foo

完美地,X 应该是 const Foo&Foo 的某种 union ,可以被视为 const Foo&。知道如何以更优雅的方式做到这一点吗?

我目前的解决方案:

Foo PreprocessFoo(const Foo& f)
{
   // create new object (very expensive).
   return Foo();
}

用法:

Foo foo;

if (something)
{
   SendToTheWorld(PreprocessFoo(foo));
}
else
{
   SendToTheWorld(foo);
}

最佳答案

我不是 100% 清楚你的意思,但如果你只是想在返回值中省略不必要的 Foo 拷贝,让你的函数变小(现在,它是)并且依靠优化编译器来解决您的问题。

一旦函数被内联,编译器将删除不必要的 Foo 拷贝。

(有兴趣的请注意:NRVO(命名返回值优化)不能应用于此处,因为无法为所有可能的返回值实例分配唯一的名称。)

关于c++ - 对临时对象的常量引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1339428/

相关文章:

c++ - 面向 C++ 开发人员的 Python

python - i阶统计python的确定性快速选择(中位数方法的中位数)

erlang - 我应该使用哪个 Erlang 的 OpenId 实现(如果有的话)?

python - 我将如何在我的网站中实现排名算法来对数据库数据进行排序?

python - 惯用地从 future 指令中收集结果

c++ - char* 与 std::string 和 const char* 之间的转换

c++ - 为 Boost 生成合理的 ctags 数据库

c++ - 为什么比较运算符这么快?

c++ - C/C++ 中可中断的命名范围

c++ - 引用 std::whatever 或 not_yet_in_std::whatever 的惯用方式是什么?