【问题标题】:An error related to assignment within an if-statement condition与 if 语句条件中的赋值相关的错误
【发布时间】:2018-07-26 22:44:11
【问题描述】:

这个结构有什么问题?

    if((auto idx = diff * 2) <= objRef.size()){


          //do something
}

其中 diff 是 ptrdiff_t 类型,而 objRef 是 std::vector 类型。

上述语句产生以下编译错误:

   1 In file included from main.cpp:1:
   2 ./bt.hpp:597:28: error: expected ')'
   3                   i
   4                   if((auto idx = diff * 2) <= objRef.size())
   5 f((auto idx = diff * 2) <= objRef.size())
   6                            ^
   7 ./bt.hpp:597:22: note: to match this '('
   8                   if((auto idx = diff * 2) <= objRef.size())
   9                      ^
  10 ./bt.hpp:597:44: error: expected expression
  11                   if((auto idx = diff * 2) <= objRef.size())
  12                                            ^

【问题讨论】:

标签: c++ c++11 if-statement assignment-operator auto


【解决方案1】:

根据这个答案:https://stackoverflow.com/a/7837092/159145if 语句条件的内容必须是表达式单变量声明

在您的情况下,auto idx = diff * 2 是一个单变量声明,但是因为您将它与 &lt;= objRef.size() 结合使用,所以 if 的条件不再是一个单变量声明,但它也不是一个表达式,因为它包含一个声明——因此编译器会抱怨。

将您的代码更改为在 if 语句之前计算 idx

auto idx = diff * 2;
if( idx <= objRef.size() ) {

}

如果您想限制idx 的范围,请使用匿名范围:

{
    auto idx = diff * 2;
    if( idx <= objRef.size() ) {

    }
}

...或者完全省略 auto idx,假设您没有进一步使用它:

if( diff * 2 <= objRef.size() ) {

}

【讨论】:

  • 请注意,C++20 可能会允许if ( auto idx = diff * 2; idx &lt;= objRef.size() ),相当于您的第二个建议。
  • @aschepler 天哪,看起来很难看
猜你喜欢
  • 2016-09-07
  • 2018-09-20
  • 2011-10-30
  • 1970-01-01
  • 2022-01-15
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
相关资源
最近更新 更多