我有一个这样的代码片段:
if ((std::vector<int>::iterator iter = std::find(v.begin(), v.end(), i)) != v.end())
{
// ....
}
但是编译器会报错这个语句。但是,将我的代码更改为
std::vector<int>::iterator iter;
if ((iter = std::find(v.begin(), v.end(), i)) != v.end())
{
// ....
}
修复此问题。
所以,我想知道为什么第一个版本不起作用,下面语句的返回值是什么?
std::vector<int>::iterator iter = std::find(v.begin(), v.end(), i)
自<<p> strong> c++ 17 您可以通过语言特性如何定义变量和比较if语句内的值?
if
和init-statement来完成此操作,如下所示:
if(auto iter = std::find(v.begin(), v.end(), i); // declare + initialize
iter != v.end()) // use in condition
{
// ....
}
您可以在if
语句中声明、初始化和使用变量来检查。通过这样做,您将能够仅在if
-statement中限制此类变量的作用域。
我想知道为什么第一个版本不工作[…]
因为它不是有效的c++语句。你不能像在第一个版本中那样声明、初始化和使用变量。
但是,根据c++语言,变量初始化和直接使用来检查是允许的。因此第二个成功了!
旁注:您可以简单地使用auto
关键字来提及详细类型,例如std::vector<int>::iterator
。
With
if ((int a = 1) == 2) ...
尝试在表达式中定义和初始化变量。这是不允许的。
但是当你写
int a;
if ((a = 1) == 2) ...
在嵌套表达式中执行简单赋值。这完全正确。