我有下面的代码,它报告“这里不允许自动”
//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)选择语句定义了 if 语句的样子:
- if (condition) statement
- if (condition) statement else statement
进一步向下条件定义:
- expression
- attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
- attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list
这让我们可以这样写
if (auto ret = Foo())
但是,在 c++17 及更高版本中,定义发生了变化(并移至 §9.4):
- if constexpropt (init-statementopt condition) statement
- if constexpropt (init-statementopt condition) statement else statement
我们现在可以这样写:
if (auto ret=Foo(); ret && Bar())
哪个应该对您的目的有用。
关于c++ - if 子句中的自动赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47823882/