C++17 : "带初始值设定项的选择语句"是否损坏?



假设我以;

开头
...
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语句。

最新更新