if子句中的自动赋值

时间:2017-12-14 23:53:36

标签: c++ c++11 c++14

我的代码如下,并且报告“此处不允许自动”

//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

1 个答案:

答案 0 :(得分:1)

您的第一个版本:

if((auto ret = GetSettings(InputField)) && ShouldWeDoThis())
在任何c ++标准下都不允许使用

,因为表达式中不能包含声明。

§6.4(来自c ++ 11)选择语句定义了if语句的外观:

  
      
  • 如果(条件)声明
  •   
  • if(条件)语句else语句
  •   

定义了进一步的条件:

  
      
  • 表达式
  •   
  • attribute-specifier-seq opt decl-specifier-seq声明符=初始化子句
  •   
  • attribute-specifier-seq opt decl-specifier-seq声明器braced-init-list
  •   

这使我们可以编写类似的内容

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())

对您的目的有帮助的