假设我以;
开头...
auto b = foo(a);
if (!a && (b < c))
{
bar(b);
}
...
,我注意到我可以使用NICE的新"选择语句使用initializer"来优化C 17;
...
if (!a && (auto b = foo(a); (b < c)))
{
bar(b);
}
...
然后,令我沮丧的是,它不编译,在GCC 7.2
下现在,这是基于更改为C 17的精神,这将是不错的,效率很高。
但是,如果我将其更改为;
...
if (!a)
{
if (auto b = foo(a); (b < c))
{
bar(b);
}
}
...
然后它有效...但是,这是什么意义,因为这只是;
...
if (!a)
{
auto b = foo(a);
if (b < c)
{
bar(b);
}
}
...
首先似乎破坏了"使用初始化器选择语句选择"的全部点。
q。因此,如果C 17的此功能破裂或无用的化妆品绒毛,如果它不允许部分条件具有此功能并要求整个"如果"携带它?
初始化器需要在布尔表达式之前出现。例如,尝试以下操作:
if (auto b = foo(a); (!a && (b < c))) {
bar(b);
}
如果您不希望根据布尔条件调用foo(a)
,则可以随时尝试这样的事情:
if (int b; (!a && ((b = foo(a)) < c))) {
bar(b);
}
显然,如果a
为TRUE,则不会调用foo(a)
。
但是,如果我将其更改为;
... if (!a) { if (auto b = foo(a); (b < c)) { bar(b); } } ...
然后它有效...但是,这是什么意义,因为这只是;
... if (!a) { auto b = foo(a); if (b < c) { bar(b); } } ...
nope。在第一个片段中,b
的范围仅限于内部if
语句。在第二个片段中,b
的范围跨越外部if
语句。