像"T"这样的模板参数是否总是被解释为每个值?

Are template arguments like 'T' always interpreted as per-value?

本文关键字:解释 是否 参数      更新时间:2023-10-16

考虑以下小示例:

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。

如果推导出,它将始终通过值传递。但是,如果您使模板参数显式,您可以通过引用传递它:

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

写入时,Bar对象将通过值传递。如果您需要,您可以通过引用来定义另一个函数

Ex。

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