c++ - if 子句中的自动赋值

标签 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

最佳答案

你的第一个版本:

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/

相关文章:

multithreading - 为什么 C++0x 标准委员会拒绝了 boost::shared_mutex?

c++ - 如何在 lambda 中捕获此对象的变量?

c++ - 模板编译错误: 'X' does not refer to a value

c++ - 如何在我的源代码中找到所有出现的地方,其中 std::string 作为拷贝而不是常量引用传递给方法?

.net - 托管代码是在 C++ 中使用 SMO 的唯一方法吗?

c++ - 单个函数的两个可变参数模板?第2部分

C++ 11初始化程序具有模棱两可的函数id表达式?

c++ - 模拟基于范围的 for 循环的开始/结束行为

c++ - 在指向对象的指针上调用 delete [] 时出现 BLOCK_TYPE_VALID 错误

c++ - 如何创建一个带有搜索功能和 pdf 下载/上传的小数据库