考虑以下小例子:
template<typename T> void foo(T a) { ... }
struct Bar { ... };
Bar x;
foo(x);
Run Code Online (Sandbox Code Playgroud)
我的问题:是否有任何情况foo(x)可以解释为foo(const Bar& x)(x通过引用传递),或者它总是被解释为foo(Bar x)(x通过值传递,即x的显式副本)?
在我的具体应用程序中,我的代码依赖于创建副本的事实(x在另一个线程中使用,而原始x超出范围).但我不确定我是否可以这样认为.我正在使用GCC 4.6.1.
如果推断,它将始终按值传递.但是,如果您将模板参数设为显式,则可以通过引用传递它:
foo<Bar&>(x); // will pass by reference
foo<Bar const&>(x); // will pass by reference to const
Run Code Online (Sandbox Code Playgroud)