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

标签 c++ visual-studio c++11 visual-studio-2012 visual-c++

此 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;
}

如果我们将 get_f 更改为:

auto get_f= []()
{
   return f;
};

然后程序运行没有崩溃。

是这段代码的问题还是编译器/标准库的bug?

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

最佳答案

在我看来,这像是标准库(或可能是编译器)的问题。

使用 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;
}

输出:f 调用

关于c++ - 从 VS 2012 中的 lambda 返回值构造 std::function 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30306218/

相关文章:

c++ - 数组是一种数据类型吗?

c++ - operator+ 混淆(指针与引用)

c++ - 如何返回一个 QUrl 是否重定向的 bool 值?

visual-studio - VSTS 和 Azure 部署持续交付错误

c++ - 推迟函数调用参数的评估

c++ - 使用 boost::interprocess 在共享内存中分配用户定义的结构

c++ - 应用程序未在未安装 VS 2008 的 PC 上运行

.net - 启动 Visual Studio - 未安装 Net Framework 4.6 - Windows 10

visual-studio - 第三方 Visual Studio 片段

c++ - 隐式与显式删除的复制构造函数