5

我有两个具有相同功能的代码片段,但是一个可以编译,另一个不能。为什么?

这个编译。

vector<int>::iterator it;
if ((it=find(v.begin(),v.end(),2))!=v.end()){
}

这个没有。

if ((vector<int>::iterator it=find(v.begin(),v.end(),2))!=v.end()){
}

这是我得到的错误。

main.cpp: In function ‘int main()’:
main.cpp:32:28: error: expected primary-expression before ‘it’
main.cpp:32:28: error: expected ‘)’ before ‘it’
main.cpp:44:5: error: expected ‘)’ before ‘return’

PS 可以自由编辑标题 - 我找不到任何描述性的内容。

4

1 回答 1

2

如果 's的全部内容都以变量声明开头(即,如果它只是一个变量声明),则只能在if's内定义一个变量。()()

您要做的就是声明一个变量,然后对其进行测试。这是不允许的。

您可以回退到两行版本,也可以编写一个基于容器的find使用boost::optionalstd::tr2::optional如下:

namespace aux {
  using std::begin; using std::end;
  template<typename C> auto adl_begin( C&& c )->decltype( begin(std::forward<C>(c)) )
  { return begin(std::forward<C>(c)); }
  template<typename C> auto adl_end( C&& c )->decltype( end(std::forward<C>(c)) )
  { return end(std::forward<C>(c)); }
}
using aux::adl_begin; using aux::adl_end;

template<typename C, typename U>
optional< decltype( typename std::decay<*adl_begin( std::declval<C&>() )>::type ) >
my_find( C&& c, U&& u ) {
  auto it = std::find( adl_begin(c), adl_end(c), std::forward<U>(u) );
  if (it == adl_end(c))
    return {none_t};
  else
    return {it};
}

上面不是返回一个iterator,而是返回一个可选的iterator,当在boolean 上下文中评估时,false如果找不到该项目。

您现在可以键入:

if( auto op_it = my_find( v, 2 ) ) {
  auto it = *op_it; // optional, but saves on `*` elsewhere
  // code
}

并大致得到你想要的。

optional在 C++14中可用boost,在可能std::tr2,并且可能std::在 C++14 中可用。和boost略有std不同。

于 2013-07-29T20:12:45.777 回答