按参数或返回值修改

时间:2015-07-27 22:59:38

标签: c++ smart-pointers c++14

说我有以下类型的别名:

class window;
class context;

using window_handle = std::unique_ptr<window>;
using context_handle = std::unique_ptr<context>;

以及一些制作句柄的函数:

window_handle make_window(/* window parameters */);
context_handle make_context(/* context parameters */);

那么将上下文组合到窗口中的最佳做法是什么?

(此操作后context_handle变量将不使用)

可能的解决方案可能是......

修改参考参数:

void attach_context(window_handle &w, context_handle &&c);

或返回一个取得以前句柄所有权的组合句柄:

window_handle attach_context(window_handle &&w, context_handle &&c);

这两种方法都有其优点,允许不同用途。

return方法的一个优点是可以创建内联窗口并删除显式临时窗口:

auto mywindow = attach_context(make_window(), make_context());

无需为wc创建额外的变量,rvalues也没问题。

但是,当我们已经有window_handle时,lvalue-reference参数方法还具有不必创建新变量或进行额外分配的优势:

auto mywindow = make_window();

if(need_attached_window)
    attach_context(mywindow, make_context());

使用返回值方法,我们必须使用std::move强制转换和其他变量或赋值:

auto mywindow = make_window();

if(need_attached_window)
    mywindow = attach_context(std::move(mywindow), make_context());

所有这些都没有考虑make_xxx可能失败。

从性能和可用性的角度来看,我应该选择哪种方法?哪个似乎最惯用?

1 个答案:

答案 0 :(得分:0)

我的方法是对窗口使用const-reference并按值传递上下文。这样的事情是明确的:

void attach_context(window_handle const& wh, context_handle ch);

必须传递对上下文的所有权,并且attach_context没有选择获取窗口的所有权并将其他内容传回去。

澄清后更新:

鉴于attach_context()解除分配并创建新的window实例,对window_handle的const引用将不起作用。所以双rvalue-reference接口可能更可取:

void attach_context(window_handle&& wh, context_handle&& ch);

为什么rvalue-references超过引用?避免接口中的非const引用。这源于Lakos&#34;大规模C ++软件开发&#34;因此,您可以在调用站点看到是否修改参数。如果你取一个地址(即非常量指针),你知道该参数将被修改,否则该参数将被该函数保持不变。这个建议是陈旧的(~1997),并且早于rvalue参考。

rvalue参考的存在提供了明显的优势。使用std::move或在呼叫方面传递右值引用可以清楚地说明正在发生的事情,达到相同的目标。