msvc std :: function不接受带有嵌套lambda的通用lambda

以下版本适用于gcc 5.2和clang 3.7,但在msvc 2015中失败:

#include <functional>

int main()
{
  auto const foo = [](auto&& i) {
    auto const bar = []{ return 100; };
    return bar();
  };

  std::function<int(int)> fn = foo;
  return 0;
}

它是msvc中的错误还是gcc和clang太松懈?


如果我使用微软官方在线编译器(这是2015年12月3日更新的版本19.00.23602.0(x86))尝试此操作,我会执行超时1。 删除std::function<int(int)> fn = foo; 将允许成功编译。 请随时通过Visual Studio Connect让Microsoft知道,以便他们可以调查并报告错误。 是的,人们可以浪费时间翻阅标准,看看这是否是“合法”的代码,但通过使用错误跟踪器,您将获得更大的回报。

1内部编译器错误总是一个错误。


这是Visual C ++ 2015中的一个错误,但它似乎在更新3中得到修复。解决方法是指定外部lambda的返回类型(感谢melak47)。

这失败了:

#include <functional>

int main()
{
    std::function<void (bool)> f =
        [](auto&&)
        {
            []{};
        };
}

有:

Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

a.cpp
C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEtype_traits(1348):
    error C2065: '_Args': undeclared identifier
    [...and more]

但是这工作:

#include <functional>

int main()
{
    std::function<void (bool)> f =
        [](auto&&) -> void
        {
            []{};
        };
}
链接地址: http://www.djcxy.com/p/72529.html

上一篇: msvc std::function doesn't accept generic lambda with a nested lambda

下一篇: "Escape" and "Clobber" equivalent in MSVC