从VS 2012中的lambda返回值构造std :: function时崩溃

Art*_*iuk 4 c++ visual-studio visual-c++ c++11 visual-studio-2012

此C++代码与VS 2012成功编译,但在运行时崩溃:

#include <iostream>
#include <functional>

void f()
{
  std::cout << "f called" << std::endl;
}

int main()
{
  auto get_f= []()
    {
        bool b = true;
        return b ? f : f;
    };

  std::function<void()> filter(get_f()); // crash here!!!
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我们将get_f更改为:

auto get_f= []()
{
   return f;
};
Run Code Online (Sandbox Code Playgroud)

然后程序运行没有崩溃.

这个代码或编译器/标准库错误是一个问题吗?

我没有使用较新版本的Visual Studio进行测试.

Jer*_*fin 5

它看起来像标准库(或可能编译器)的问题.

使用VS 2013,它可以毫无问题地编译和运行.如果我们添加代码来调用filter运行的代码:

#include <iostream>
#include <functional>

void f()
{
  std::cout << "f called" << std::endl;
}

int main()
{
  auto get_f= []()
    {
        bool b = true;
        return b ? f : f;
    };

  std::function<void()> filter(get_f()); // crash here!!!
  filter();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出: f called