像'T'这样的模板参数是否总是被解释为per-value?

时间:2012-01-20 09:25:01

标签: c++ templates

考虑以下小例子:

template<typename T> void foo(T a) { ... }
struct Bar { ... };
Bar x;
foo(x);

我的问题:是否有任何情况foo(x)可能被解释为foo(const Bar& x)(x通过引用传递),或者它总是被解释为foo(Bar x)(x通过值传递,即显式x)的副本?

在我的具体应用程序中,我的代码依赖于创建副本的事实(x在另一个线程中使用,而原始x超出范围)。但我不确定我是否可以这样认为。我正在使用GCC 4.6.1。

2 个答案:

答案 0 :(得分:5)

如果推断,它将始终按值传递。但是,如果您将模板参数设为显式,则可以通过引用传递它:

foo<Bar&>(x); // will pass by reference
foo<Bar const&>(x); // will pass by reference to const

答案 1 :(得分:1)

写入时,Bar对象将按值传递。如果需要,可以随时定义另一个函数

实施例

template<typename T> void fooByRef(const T& a) { ... }