考虑以下小例子:
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。
答案 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) { ... }