5

AS3 を何年も使用した後、C++ を再学習しようとしています。リファレンスはまだ私にフィットしています。

次の関数を検討してください。

#include <cstdio>
#include <list>

void f(std::list<int>& v) {
  for (std::list<int>::iterator i = v.begin(); i != v.end(); ++i)
    printf("Hello %d\n", *i);
}

std::list<int> get(void) {
  std::list<int> list;
  list.push_back(0);
  return list;
}

ここで、次のことを行います。

std::list<int> l = get();
f(l);

は問題ありませんf(get())が、次のエラーが発生します。

「'f' の呼び出しに一致する関数がありません」、「実行可能な候補関数がありません: 第 1 引数の `'std::list<int>' から 'std::list<int>&' への既知の変換がありません」

何故ですか?関数の結果が目に見えないからconstですか?

4

3 に答える 3

8

これを行う場合:

f(get());

std::list<int>に一時的に渡しますf()。一時は、非 const 参照にバインドできません。constしたがって、引数を変更したくないため、参照を渡すことでこれを修正できます。

void f(const std::list<int>& v) 
{ //   ^^^^^
  for (std::list<int>::const_iterator i = v.begin(); i != v.end(); ++i)
  { //                 ^^^^^^^^^^^^^^
    printf("Hello %d\n", *i);
  }
}

を使用する必要があることに注意してください。対応するメソッドは s を返すconst_iteratorためです。C++11 では、これを次のように単純化できます。std::list::begin() constend()const_iterator

for (auto i = v.begin(); i != v.end(); ++i)
  ...

あるいは

for (const auto& i : v)
  std::cout << i << "\n";
于 2013-06-18T16:31:37.350 に答える