【发布时间】:2015-12-22 16:49:12
【问题描述】:
有时我会在具有 5 个局部变量(包括参数)的局部函数中执行 std::find_if(例如)。但是,我传递给 STL 算法的 lambda 只需要访问其中的 1 个。我可以通过以下两种方式之一来捕捉它:
void foo(int one, int two, int three)
{
std::vector<int> m_numbers;
int four, five;
std::find_if(m_numbers.begin(), m_numbers.end(), [=](int number) {
return number == four;
});
}
或者我可以这样做:
void foo(int one, int two, int three)
{
std::vector<int> m_numbers;
int four, five;
std::find_if(m_numbers.begin(), m_numbers.end(), [four](int number) {
return number == four;
});
}
(注意我没有编译这段代码,对任何语法错误或其他错误表示歉意)
我知道隐式捕获基于 odr-used 规则,因此在功能和实现方面,我认为两者是相同的。你什么时候会使用显式捕获而不是隐式捕获?我唯一的想法与封装原则有些相关:仅访问您需要的东西允许编译器帮助您确定何时访问您不应该访问的变量。它还保持方法的本地状态(它是不变量,在函数执行期间的函数生命周期内)更安全。但这些真的是实际问题吗?
是否有使用显式捕获而不是隐式捕获的功能原因?有什么好的经验法则或最佳实践可以遵循?
【问题讨论】:
-
IIRC,Scott Meyers 建议(在他的最新书中)几乎只在这种情况下使用隐式捕获,在这种情况下,它是使用它的函数的参数,而不是保留它。当然,在各种场景中使用隐式捕获时,您可能会陷入陷阱。
-
此类陷阱的示例将不胜感激。这些示例将有助于对比差异并帮助建立良好的一般实践规则。
-
@chris Scott Meyers 的建议正好相反。有效的现代 C++,第 31 条:避免默认捕获模式。
-
@LogicStuff,这就是我想说的,带有默认含义的隐含含义,并且谨慎使用它,也许仅在这种特定情况下。
-
我实际上有有效的现代 C++,我将阅读第 31 条,希望这是找到问题答案的良好开端。