【问题标题】:auto assignment in if clauseif 子句中的自动赋值
【发布时间】:2018-05-29 03:56:46
【问题描述】:

我有下面的代码,它报告“这里不允许自动”

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

【问题讨论】:

  • 如果您使用的是 Visual Studio 2017,您是否使用新的 C++17 功能?还是您仅限于 C++14?
  • @DeiDei 好点,其实还是2013的编译器,推送升级到2017
  • C++17 允许if (auto ret = GetSettings(InputField); ret &amp;&amp; ShouldWeDoThis())
  • 一旦你有了它,处理这个问题的惯用方法是使用if (auto ret = GetSettings(InputField); ret &amp;&amp; ShouldWeDoThis()) { do something with ret; }。这种初始化在ifswitch 中是允许的,类似于for 循环的初始化部分。请注意ret 的值不一定在if 语句中检查;你仍然需要自己做。

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


【解决方案1】:

您的第一个版本:

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

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

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

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

进一步向下条件定义:

  • 表达式
  • attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
  • attribute-specifier-seqopt decl-specifier-seq 声明符括号初始化列表

这让我们可以写出类似的东西

if (auto ret = Foo())

但是,在 c++17 及更高版本中,定义发生了变化(并移至第 9.4 节):

  • if constexpropt (init-statementopt 条件) 语句
  • if constexpropt (init-statementopt 条件) 语句 else 语句

我们现在可以这样写:

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

这应该对您的目的有用。

【讨论】:

  • 为了扩展答案,可以执行多个初始化语句:if (auto stream = wstream.lock(); auto delegate = stream-&gt;_delegate.lock())。 IE。在处理多个需要锁定以执行条件块的std::weak_ptrs 时很有用。
猜你喜欢
  • 2019-03-25
  • 2011-10-30
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 2011-10-31
  • 2021-08-13
  • 2015-07-15
  • 2020-08-07
相关资源
最近更新 更多