C++ 在FOR循环语句的条件部分使用声明

C++ 在FOR循环语句的条件部分使用声明,c++,for-loop,C++,For Loop,阅读我发现,for循环的条件部分可以是表达式,可以在上下文中转换为bool,也可以是带有强制大括号或相等初始值设定项的单变量声明(6.4/1中的语法规范): 条件: 表情 类型说明符seq declarator=赋值表达式 但我从来并没有在源代码中看到后面的用法 对于循环语句? for (int i = 0; bool b = i < 5; ++i) { // `b` is always convertible to `true` until the end of its sc

阅读我发现,
for
循环的条件部分可以是表达式,可以在上下文中转换为
bool
,也可以是带有强制大括号或相等初始值设定项的单变量声明(6.4/1中的语法规范):

条件:

  • 表情
  • 类型说明符seq declarator=赋值表达式
但我从来并没有在源代码中看到后面的用法

对于循环语句

for (int i = 0; bool b = i < 5; ++i) {
    // `b` is always convertible to `true` until the end of its scope
} // scope of `i` and `b` ends here

但是它们都是非常人为的。

所有三个语句
if
for
while
都可以以类似的方式使用。这为什么有用?有时候就是这样。考虑这一点:

Record * GetNextRecord();         // returns null when no more records
Record * GetNextRecordEx(int *);  // as above, but also store signal number

// Process one
if (Record * r = GetNextRecord()) { process(*r); }

// Process all
while (Record * r = GetNextRecord()) { process(*r); }

// Process all and also keep some loop-local state
for (int n; Record * r = GetNextRecordEx(&n); )
{
    process(*r);
    notify(n);
}
这些语句将所需的所有变量保持在尽可能小的范围内。如果不允许在语句内部使用声明表单,则需要在语句外部声明一个变量,但只在语句持续期间使用它。这意味着您可能会泄漏到太大的范围,或者您将需要难看的额外范围。允许在语句中使用声明提供了一种方便的语法,虽然这种语法很少有用,但如果它有用的话,就很好了

也许最常见的地方用例是在多分派cast情况下,如下所示:

if (Der1 * p = dynamic_cast<Der1 *>(target)) visit(*p);
else if (Der2 * p = dynamic_cast<Der2 *>(target)) visit(*p);
else if (Der3 * p = dynamic_cast<Der3 *>(target)) visit(*p);
else throw BadDispatch();
if(Der1*p=dynamic_cast(target))访问(*p);
否则如果(Der2*p=动态施法(目标))访问(*p);
否则,如果(Der3*p=动态施法(目标))访问(*p);
否则抛出BadDispatch();
旁白:只有
if
语句允许条件为false的情况下的代码路径,在可选的
else
块中给出。
while
for
都不允许您以这种方式使用布尔检查的结果,即没有
用于。。。当。。。else
语言中的构造

if (Der1 * p = dynamic_cast<Der1 *>(target)) visit(*p);
else if (Der2 * p = dynamic_cast<Der2 *>(target)) visit(*p);
else if (Der3 * p = dynamic_cast<Der3 *>(target)) visit(*p);
else throw BadDispatch();