像"T"这样的模板参数是否总是被解释为每个值?
Are template arguments like 'T' always interpreted as per-value?
考虑以下小示例:
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) { ... }
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 任何人都可以解释一下我是否需要 & 在第一个代码片段中
- 是否可以解释为什么这会返回 21
- 是否有针对跳跃二进制搜索的直观解释
- 字符串中的空格是否会改变程序解释它的方式
- 程序读取文字或解释变量所需的时间是否更少
- 如何判断 std::vector 是否调整了自身大小,以及如何解释指向向量内值的指针不再有效
- 是否有任何方法可以在初始化之前更改变量的类型,您可以用示例解释
- 这种编译器优化不一致是否完全由未定义的行为来解释
- 重新解释cast<是否安全;bool*>清空内存
- 邪恶的字节块重新解释是否有效C++
- 编译器是否应该正确地将布尔中的任意非零值解释为true
- 我是否正确解释了Visual Studio程序集输出
- 我对§3.3.2/6中"第一"一词的解释是否正确?
- 像"T"这样的模板参数是否总是被解释为每个值?
- 在void*和void*之间进行强制转换时,混合使用静态强制转换和重新解释强制转换是否不安全?