作为参数的函数是不是必须按值传递? [复制]

Posted

技术标签:

【中文标题】作为参数的函数是不是必须按值传递? [复制]【英文标题】:Do functions as parameters have to be passed by value? [duplicate]作为参数的函数是否必须按值传递? [复制] 【发布时间】:2021-01-28 20:50:25 【问题描述】:

我试图了解作为函数参数的函数(主要是 lambda 表达式)是如何工作的。那么为什么例如标准库中的比较函数是按值传递而不是通过const&

【问题讨论】:

特别是,接受的答案很好地解释了为什么函数对象应该按值传递的一个相当模糊的原因。 这是否也适用于具有实际参数的函数?我是否正确理解 const& 也应该可以工作,但性能较差? 是的,是的:无论函数对象采用多少参数,相同的推理都适用,并且您对const& 的理解是正确的。当您在该页面时,请考虑查看 Ben Voigt 的简明答案,这是一个很好的选择。 标记的答案只涉及std::function。如果您通过模板函数传递函数,则更适合这个问题:***.com/questions/65562986/… 【参考方案1】:

函子可以有他们修改的状态。如果您将仿函数设为const,则它无法修改该状态。

【讨论】:

标准算法的谓词怎么样? Unless otherwise specified, algorithms that take function objects as arguments can copy those function objects freely,因此依赖于修改内部状态的谓词会产生不可预测的结果。为什么首先要复制? (或者我的“因此”是一个错误的前提?) @largest_prime_is_463035818 它很可能会产生不可预知的结果。也就是说,您仍然希望按值传递,否则您将无法将 std::mt19937 传递给 std::generate 以创建一系列随机值。

以上是关于作为参数的函数是不是必须按值传递? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

参数真的是按值传递吗? [复制]

Java函数参数是不是总是按值传递数组? [复制]

ECMAScript 中所以函数的参数都是按值传递

JS中函数参数值传递和引用传递

输入参数传递:是不是有有效的按值传递的大小阈值?

JavaScript深入之参数按值传递