我正在阅读源代码,它包含以下几行。
auto updateSlack = [&](const char slack_type, const double s) {
if (slack_type == 'e') {
wns.early_slack = min(s, wns.early_slack);
tns.early_slack += s;
}
else if (slack_type == 'l') {
wns.late_slack = min(s, wns.late_slack);
tns.late_slack += s;
}
};
我对" [&]" " ="之后的符号运营商。任何人都能说出这究竟是什么意思吗?
答案 0 :(得分:6)
您所展示的是变量声明。
auto
表示将推断出变量的类型。updateSlack
是变量的名称。=
指定变量将使用某个值进行初始化(通过复制初始化)。答案 1 :(得分:0)
函数声明为Lambda function,其中&影响其中使用的变量范围。
答案 2 :(得分:0)
此语句使用lambda表达式。
auto updateSlack = [&](const char slack_type, const double s) {
if (slack_type == 'e') {
wns.early_slack = min(s, wns.early_slack);
tns.early_slack += s;
}
else if (slack_type == 'l') {
wns.late_slack = min(s, wns.late_slack);
tns.late_slack += s;
}
};
编译器做了两件事。第一个是编译器定义一个未命名的类,它将包含对应于lambda表达式主体的函数调用操作符。
第二个是编译器创建该类的对象并将其分配给变量updateSlack
。
您可以通过以下方式想象
struct
{
auto &r1 = wns;
auto &r2 = tns;
void operator ()( const char slack_type, const double s ) const
{
if (slack_type == 'e') {
wns.early_slack = min(s, wns.early_slack);
tns.early_slack += s;
}
else if (slack_type == 'l') {
wns.late_slack = min(s, wns.late_slack);
tns.late_slack += s;
}
}
} updateSlack;
然后你可以在程序中的某个地方调用对象的函数调用操作符,例如
updateSlack( 'l', 10.10 );