5

同じ機能を持つ 2 つのコード スニペットがありますが、一方はコンパイルされ、もう一方はコンパイルされません。なんで?

これはコンパイルします。

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

if()内容全体が変数宣言で()始まる場合 (つまり、変数宣言以外の何ものでもない場合) にのみ、 内で変数を定義できます。

あなたがやろうとしているのは、変数を宣言してから、それをテストすることです。それは許可されていません。

2 行バージョンにフォールバックするか、次のようにorfindを使用するコンテナーベースを作成できます。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、上記はオプションのを返します。これは、 ean コンテキストでiterator評価されると、アイテムが見つからない場合です。boolfalse

次のように入力できます。

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

そしておおよそあなたが望むものを手に入れます。

optionalboost、たぶんstd::tr2、おそらくstd::C++14 で利用できます。boostとはstd少し異なります。

于 2013-07-29T20:12:45.777 に答える