if子句中的自动赋值

Bin*_*Lan 6 c++ c++11 c++14

我在下面有代码并报告"此处不允许自动"

//GeSettings() returns boost::optional<ValueType> and could be empty

if((auto ret = GetSettings(InputField)) && ShouldWeDoThis())
{
   do something with ret;
}
Run Code Online (Sandbox Code Playgroud)

但如果罚款就改变如下.

if(auto ret = GetSettings(InputField))
{
    if(ShouldWeDoThis())
    {
        do something with ret;
    }
}
Run Code Online (Sandbox Code Playgroud)

背后的原因可能是傻逼我可能会问为什么?我正在使用Visual Studio 2017

sp2*_*nny 7

您的第一个版本:

\n\n
if((auto ret = GetSettings(InputField)) && ShouldWeDoThis())\n
Run Code Online (Sandbox Code Playgroud)\n\n

在任何 C++ 标准下都是不允许的,因为表达式中不能有声明。

\n\n

\xc2\xa76.4 (来自 c++11) 选择语句定义了 if 语句的样子:

\n\n
\n
    \n
  • if(条件)语句
  • \n
  • if(条件)语句 else 语句
  • \n
\n
\n\n

进一步向下条件定义:

\n\n
\n
    \n
  • 表达
  • \n
  • 属性说明符-seq opt decl-说明符-seq 声明符 = 初始化子句
  • \n
  • 属性说明符-seq opt decl-说明符-seq 声明符花括号初始化列表
  • \n
\n
\n\n

这使我们可以写类似的东西

\n\n
if (auto ret = Foo())\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,在 c++17 及更高版本中,定义发生了变化(并移至 \xc2\xa79.4):

\n\n
\n
    \n
  • if constexpr opt (init-statement opt条件) 语句
  • \n
  • if constexpr opt (init-statement opt条件) 语句 else 语句
  • \n
\n
\n\n

我们现在可以写这样的东西:

\n\n
if (auto ret=Foo(); ret && Bar())\n
Run Code Online (Sandbox Code Playgroud)\n\n

这应该对您的目的有用。

\n