2

私はclang3.1(gccは正常に動作します)でこの奇妙な問題を抱えています(ここでコードを簡略化しました)。std :: function(値で渡される)の不適切な使用またはclangのバグですか?

template <typename Container>
struct A
{
  using function_type = std::function<char(char)>;

  A(Container c, function_type f) : it_(c.begin()), f_(f) {}
  typename Container::value_type operator*() { return *it_; }

  typename Container::iterator it_;
  function_type f_;
};

template <typename Cont>
A<Cont> makeA(Cont c, std::function<char(char)> f)
{
  return A<Cont>(c, f);
}

char f(char ch) { return ch; }

int main()
{
  std::string s { "foo" };
  auto a = makeA(s, f); // wraps s.begin()
  std::clog << "main: " << *(s.begin()) << std::endl; // prints 'f'
  std::clog << "main: " << *a << std::endl; // prints garbage
  return 0;
}

Max OSXLionでAppleclang4.1(llvm 3.1)を使用しています。

2番目のパラメーターのタイプを別のパラメーター(intなど)に変更すると、すべてが正常に機能します。

'make'ファクトリを使用する代わりに、ctorから直接Aオブジェクトを作成すると、すべてが正常に機能します。

それがclangのバグなのか、私の誤解なのか、本当に理解できません。

4

1 に答える 1

6

stringのコンストラクターに by 値を渡しA、ローカル文字列にイテレーターを作成しています。文字列はコンストラクターの最後で破棄され、無効な反復子と未定義の動作が残ります。

//`c` is a local copy of the string
A(Container c, function_type f) :
    //c.begin() returns an iterator into `c`
    it_(c.begin()),
    f_(f)
{
}//`c` is destroyed, leaving it_ as a dangling iterator

//Dereferences `it_` -- undefined behaviour
typename Container::value_type operator*() { return *it_; }
于 2012-12-30T12:01:10.993 に答える