【发布时间】:2010-09-16 21:48:18
【问题描述】:
我有一个 C++ 数据结构,它是其他计算所需的“便签本”。它的寿命不长,并且不经常使用,因此对性能不是很重要。但是,它在其他可更新跟踪字段中包含一个随机数生成器,虽然生成器的实际值并不重要,但更新值而不是复制和重用该值很重要。 这意味着一般来说,此类的对象是通过引用传递的。
如果一个实例只需要一次,最自然的方法是在需要的地方构造它们(可能使用工厂方法或构造函数),然后将暂存器传递给使用方法。消费者的方法签名使用按引用传递,因为他们不知道这是唯一的用途,但工厂方法和构造函数按值返回 - 您不能通过引用传递未命名的临时对象。
有没有办法避免用讨厌的临时变量阻塞代码?我想避免以下情况:
scratchpad_t<typeX<typeY,potentially::messy>, typename T> useless_temp = factory(rng_parm);
xyz.initialize_computation(useless_temp);
我可以在本质上制作暂存器 mutable 并只标记所有参数 const &,但这并没有让我觉得这是最佳实践,因为它具有误导性,而且我不能为我不完全的课程这样做控制。通过右值引用传递将需要向所有暂存器使用者添加重载,这违背了目的 - 具有清晰简洁的代码。
考虑到性能并不重要(但代码大小和可读性是关键),传递此类暂存器的最佳实践方法是什么? 如果 必需的,但最好只有 C++03 的特性就足够了。
编辑:需要明确的是,使用临时是可行的,不幸的是我想避免代码中的混乱。如果你从不给临时文件起名字,它显然只使用过一次,而且要阅读的代码行数越少越好。此外,在构造函数的初始化器中,不可能声明临时对象。
【问题讨论】:
-
您可以按值而不是参考来获取“便签本”吗?这样它可能是临时的和可变的。
-
这样做意味着制作一个副本——在上述临时变量无用的情况下很好,但当我确实需要重用该变量时就不那么好了;这意味着以相同的状态重新运行 rng,这是个坏主意。
-
@Eamon Nerbonne:可能,只是概念上。在许多编译器的优化构建中,参数将“就地”构建。
-
@Charles:我认为他的意思是有时他会使用按顺序传递给几个例程的实际对象。在这种情况下,他不想为每个例程制作副本,它们必须通过引用传递。
-
我的意思是,在某些地方
useless_temp实际上被重复使用了多次,因此并非没用。在 that 场景中按值传递意味着多次重复使用 same 值,从而破坏暂存器。想想按值传递一个随机数生成器 - 如果你这样做两次,两个实例将产生完全相同的随机数序列,这是不可取的。
标签: c++ reference c++11 constants temporaries