在if子句中自动分配

auto assignment in if clause

本文关键字:分配 if 子句      更新时间:2023-10-16

我有以下代码,它报告"在这里不允许自动"

//GeSettings() returns boost::optional<ValueType> and could be empty
if((auto ret = GetSettings(InputField)) && ShouldWeDoThis())
{
   do something with ret;
}

,但如果很好地改变。

if(auto ret = GetSettings(InputField))
{
    if(ShouldWeDoThis())
    {
        do something with ret;
    }
}

背后的原因可能是愚蠢的买,请问为什么?我正在使用Visual Studio 2017

您的第一个版本:

if((auto ret = GetSettings(InputField)) && ShouldWeDoThis())

在任何C 标准下都不允许使用,因为您无法在表达式中发表声明。

§6.4(来自C 11)选择语句定义了语句的样子:

  • 如果(条件)语句
  • 如果(条件)语句else语句

定义了进一步的下降条件:

  • 表达
  • attribute-specifier-seq opt decl-secifier-seq declarator = initializer-clause
  • attribute-specifier-seq opt dect-secifier-seq声明符

这使我们能够写

之类的东西
if (auto ret = Foo())

然而,在C 17和向前,定义更改(并移至第§9.4):

  • 如果constexpr opt (init-statement opt 条件)语句
  • 如果constexpr opt (init-statement opt 条件)语句else语句

我们现在可以写下:

if (auto ret=Foo(); ret && Bar())

应该对您的目的有用。