Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是像';T';是否总是按值进行解释?_C++_Templates - Fatal编程技术网

C++ 是像';T';是否总是按值进行解释?

C++ 是像';T';是否总是按值进行解释?,c++,templates,C++,Templates,考虑以下小例子: template<typename T> void foo(T a) { ... } struct Bar { ... }; Bar x; foo(x); 模板void foo(ta){…} 结构条{…}; 条形图x; foo(x); 我的问题是:foo(x)是否会被解释为foo(const Bar&x)(x通过引用传递),或者它总是被解释为foo(Bar x)(x通过值传递,即x的显式副本) 在我的具体应用程序中,我的代码依赖于创建副本的事实(x在另一个线程中

考虑以下小例子:

template<typename T> void foo(T a) { ... }
struct Bar { ... };
Bar x;
foo(x);
模板void foo(ta){…}
结构条{…};
条形图x;
foo(x);
我的问题是:
foo(x)
是否会被解释为
foo(const Bar&x)
(x通过引用传递),或者它总是被解释为
foo(Bar x)
(x通过值传递,即x的显式副本)


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

如前所述,Bar对象将按值传递。如果您需要通过引用来定义另一个函数,则始终可以定义它

模板void fooByRef(const T&a){…}
如果推导,它将始终按值传递。但是,如果使模板参数显式,则可以通过引用传递它:

foo<Bar&>(x); // will pass by reference
foo<Bar const&>(x); // will pass by reference to const
foo(x);//将通过引用传递
foo(x);//将通过引用传递到const

为什么不在示例中尝试一下呢。我认为T可以是从int到指针的任何东西,等等。
foo<Bar&>(x); // will pass by reference
foo<Bar const&>(x); // will pass by reference to const