与 if 语句条件中的赋值相关的错误

An error related to assignment within an if-statement condition

提问人:user9196120 提问时间:2/16/2018 最后编辑:Vadim Kotovuser9196120 更新时间:5/24/2018 访问量:97

问:

这个结构可能有什么问题?

    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-语句 赋值运算符 自动

答:

0赞 Dai 2/16/2018 #1

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

在你的例子中,是一个单变量声明,但是因为你把它与 的条件结合起来,所以它就不再是单变量声明了,但它也不是一个表达式,因为它包含一个声明 - 因此编译器抱怨。auto idx = diff * 2<= objRef.size()if

将代码更改为在语句之前计算:idxif

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

}

如果要限制 then 使用匿名范围的范围:idx

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

    }
}

...或者干脆完全省略,假设你没有进一步的用途:auto idx

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

}

评论

1赞 aschepler 2/16/2018
请注意,C++2 可能会允许 ,相当于您的第二个建议。if ( auto idx = diff * 2; idx <= objRef.size() )
0赞 Swift - Friday Pie 2/16/2018
@aschepler天哪,这看起来很丑