这是lambda表达式的有效(滥用)用法吗?

| 众所周知,要从嵌套循环中将“ 0”从外循环中移出却没有一个都不容易: a
goto
(示例代码。) 外循环中的另一种条件检查(示例代码。) 将两个循环都放在一个额外的函数中并返回,而不是返回“ 0”(示例代码。) 但是,您必须承认,所有这些都有些笨拙。尤其是缺少函数版本,因为缺少调用循环的上下文,因为您需要将循环中需要的所有内容作为参数传递。 此外,对于每个嵌套循环,第二个循环变得更糟。 因此,我个人仍然认为
goto
版本是最干净的版本。 现在,考虑所有C ++ 0x和其他内容,第三个选择使我有了使用lambda表达式的想法:
#include <iostream>

bool CheckCondition(){
  return true;
}

bool CheckOtherCondition(){
  return false;
}

int main(){
  [&]{while(CheckCondition()){
    for(;;){
      if(!CheckOtherCondition())
        return;
      // do stuff...
    }
    // do stuff...
  }}();
  std::cout << \"yep, broke out of it\\n\";
}
(例如在Ideone的示例。) 这使得第三个选项提供的简单ѭ5的语义美感同时又不遭受上下文问题的困扰,并且(几乎)与
goto
版本一样干净。它甚至比上述任何选项都更短(按字符)。 现在,在发现语言的优美用法之后,我学会了保持喜悦,因为几乎总是存在某种弊端。有这个吗?还是有解决这个问题的更好方法?     
已邀请:
请不要在我管理的项目中这样做。我认为这是对lambda的尴尬滥用。 使用
goto
时,请使用
goto
。     
我认为完全有效。虽然我更愿意为我的名字分配名称,但使代码更具自我记录性,即
int main(){

  auto DoThatOneThing = [&]{while(CheckCondition()){
    for(;;){
      if(!CheckOtherCondition())
        return;
      // do stuff...
    }
    // do stuff...
  }};

  DoThatOneThing();
  std::cout << \"yep, broke out of it\\n\";
}
    
通过哪种方式对
void frgleTheBrgls()
{
  while(CheckCondition()) {
    for(;;) {
      if(!CheckOtherCondition())
        return;
      // do stuff...
    }
    // do stuff...
  }
}

int main()
{
  frgleTheBrgls();
  std::cout << \"yep, broke out of it\\n\";
}
这是众所周知的(函数,就像在BASIC中一样),更清晰(算法的名字很好地解释了它的作用),并且其作用与您的完全相同。   尤其是缺少函数版本,因为缺少调用循环的上下文,因为您需要将循环中需要的所有内容作为参数传递。 我认为这是一个优势。您确切地看到了使小碎片变皱所需的东西。编程时,明确性通常是一件好事。     
建议的语法有一个缺点:嵌套循环不能超过2个。 \'goto \'语法允许这样做:
int main()
{
    for (;;)
    {
        for (;;)
        {
            for (;;)
            {
                if (CheckCondition1()) goto BREAK_ON_COND1;
                if (CheckCondition2()) goto BREAK_ON_COND2;
                if (CheckCondition3()) break;
                // Do stuff when all conditions are false
            }
            // Do stuff when condition 3 becomes true
        }
    BREAK_ON_COND2:
        // Do stuff when condition 2 becomes true
    }
BREAK_ON_COND1: // When condition 1 becomes true
    std::cout << \"yep, broke out of it\\n\";
}
    

要回复问题请先登录注册