c++可以"如果可能的话通过引用传递"吗?
Can c++ 'pass by reference if possible'?
我有一个带有只读参数的方法。
template <typename T>
void foo(const T t) {...}
这个定义的好处是foo(2)
语法正确。但是,它的缺点是,在大对象上应用foo
会使它复制对象。由于我只从论点中阅读,这只是浪费时间和记忆。
标准解决方案是将参数t
常量引用。但是,这有一个缺点,即foo(2)
语法不再正确。我将不得不做我觉得不幸int i = 2; foo(i);
。
有没有办法两全其美?因此,foo(2)
在语法上是正确的,并且在对象上应用foo
使其通过引用传递?
编辑:显然,常量引用已经是两全其美的。现在我想知道为什么会这样。为什么foo(2)
语法正确?2
如何成为这里的参考?
C++ 会在需要时实现临时,您可以将临时绑定到const&
,但不能绑定&
。
因此,foo_value(2)
创建了一个int
,其值2
称为t
作为参数。 foo_cref(2)
创建一个匿名临时参数,然后将 int const& t
参数绑定到它,其中foo_value
和foo_cref
是您在问题中谈论的foo
的明显变体。
相关文章:
- 如果非动态变量被指针引用,何时超出范围?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- 在C++中,如果成员引用在其声明中初始化,为什么需要存储空间?
- C++我们可以取消引用此指针吗?如果是这样,那么如何,如果不是,那为什么?
- 如果可能的话,C++总是更喜欢右值引用转换运算符而不是常量左值引用吗?
- 如果 copts 不允许系统路径,如何引用外部依赖项使用的系统库?
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 如果包含引用成员的类中缺少原始变量,为什么它仍然可以访问?
- 强制从函数中推导模板以生成常量引用(如果适用)
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 如果函数的返回值将用作右值引用而不是左值,有没有办法使函数具有不同的行为?
- 如果结果存储在变量中forward_as_tuple然后在 std::apply 中使用之前丢失右值引用
- 如果一个函数通过引用返回一个数组,它是指针的衰减吗?
- STL算法函数,如累加,如果传递给它们的函数接受引用,请避免复制
- 如果容器不是调用函数中的引用,则使用 std::thread 传递对迭代器的引用将失败
- c++可以"如果可能的话通过引用传递"吗?
- weak_ptr语言 - 解引用-如果过期抛出