我的代码如下,并且报告“此处不允许自动”
//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
答案 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())
对您的目的有帮助的