模板接口 - 通过引用或按值使用

时间:2014-12-27 02:32:57

标签: c++ templates interface reference

我有一个模板界面

template <typename Graph, typename V>
size_t bfs(const Graph& g, const V s, const V x);

其中类型V是顶点的名称。预计它将是一个简单的复制类型(任何原始的),但没有任何东西阻止用户使用std::string作为名称。

使用引用,复制了8个字节(64位),并且必须进行额外的工作才能取消引用它。这与4个字节进行比较,对于命名顶点的intsize_t通常情况没有额外的工作。

界面应该是const V&还是const V

1 个答案:

答案 0 :(得分:2)

可能需要在实现中复制的任何推断参数应按值传递(添加const毫无意义,但:它不会更改界面但限制实施)。主要原因是:如果用户想要/需要给出参数引用语义并且它通过值传递,则可以容易地完成,例如通过传递std::ref(x)。但是,一旦实体通过引用传递(包括所有三种形式T&T const&T&&),就无法使其具有价值行为。