C++ 将std::function作为参数传递时出现问题

C++ 将std::function作为参数传递时出现问题,c++,clang,std-function,C++,Clang,Std Function,我在Clang3.1中遇到了一个奇怪的问题(我在这里简化了代码)(gcc可以正常工作)。 这是对std::function(按值传递)的不当使用还是一个叮当作响的bug template <typename Container> struct A { using function_type = std::function<char(char)>; A(Container c, function_type f) : it_(c.begin()), f_(f) {}

我在Clang3.1中遇到了一个奇怪的问题(我在这里简化了代码)(gcc可以正常工作)。 这是对std::function(按值传递)的不当使用还是一个叮当作响的bug

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;
}
模板
结构A
{
使用function_type=std::function;
A(容器c,函数类型f):它(c.begin()),f(f){
typename容器::值_类型运算符*(){return*it_;}
typename容器::迭代器;
函数类型f;
};
模板
A makeA(Cont c,std::function f)
{
返回A(c,f);
}
char f(char ch){return ch;}
int main()
{
std::字符串s{“foo”};
auto a=makeA(s,f);//包装s.begin()

std::clog您正在将
字符串
按值传入
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_; }