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

C++ 模板接口-通过引用或值使用,c++,templates,interface,reference,C++,Templates,Interface,Reference,我有一个模板界面 template <typename Graph, typename V> size_t bfs(const Graph& g, const V s, const V x); 模板 尺寸(常数图&g、常数vs、常数vx); 其中,类型V是顶点的名称。它应该是一个简单的复制类型(任何原语),但是没有什么可以阻止用户使用std::string作为名称 对于引用,将复制8个字节(64位),并且必须做额外的工作来解除引用。这与命名顶点的int或size\u t通

我有一个模板界面

template <typename Graph, typename V>
size_t bfs(const Graph& g, const V s, const V x);
模板
尺寸(常数图&g、常数vs、常数vx);
其中,类型V是顶点的名称。它应该是一个简单的复制类型(任何原语),但是没有什么可以阻止用户使用
std::string
作为名称

对于引用,将复制8个字节(64位),并且必须做额外的工作来解除引用。这与命名顶点的
int
size\u t
通常情况下的4个字节相比,没有额外的工作


接口应该是
const V&
还是仅仅是
const V

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