我有一个带有只读参数的方法。
template <typename T>
void foo(const T t) {...}
此定义的好处是foo(2)
在语法上是正确的。但是,这样做的缺点是在大对象上应用foo
会使它复制对象。由于我只是从参数中读取内容,所以这只是浪费时间和内存。
标准解决方案是使参数t
成为const引用。但是,这样做的缺点是foo(2)
在语法上不再正确。我不得不做int i = 2; foo(i);
,但我很不幸。
有没有办法做到两全其美?这样foo(2)
在语法上是正确的,并且在对象上应用foo
会使它通过引用传递吗?
编辑:显然,const引用已经是两全其美了。现在,我想知道为什么会这样。为什么foo(2)
在语法上正确? 2
如何在此处成为参考?
答案 0 :(得分:1)
C ++将在需要时具体化临时对象,您可以将临时对象绑定到const&
,但不能绑定到&
。
因此foo_value(2)
创建一个名为int
的值2
作为参数的t
。 foo_cref(2)
创建一个匿名临时文件,然后将int const& t
参数绑定到其中,其中foo_value
和foo_cref
是您在问题中谈论的foo
的明显变体