【问题标题】:msvc std::function doesn't accept generic lambda with a nested lambdamsvc std::function 不接受带有嵌套 lambda 的通用 lambda
【发布时间】:2015-12-13 04:43:33
【问题描述】:

以下内容适用于 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 的 bug 还是 gcc 和 clang 太松散?

【问题讨论】:

  • Visual Studio 的哪个版本?
  • 改成auto const foo = [](auto&amp;&amp; i) -&gt; int { 会编译
  • @melak47 明确指定返回类型确认与 vs2015 一起使用。虽然它不适用于最新的(它是最新的吗?)编译器 v19.00.23602.0 (webcompiler.cloudapp.net)。无论如何,我认为没有必要指定返回类型。
  • 我肯定还是会提交一个错误,更新 1 和我认为编译器的 WIP 更新 2 版本都不接受它。

标签: c++ visual-c++ gcc lambda c++17


【解决方案1】:

如果我使用 Microsoft's official online compiler(最新版本 19.00.23602.0(x86) 于 2015 年 12 月 3 日更新)尝试此操作,我会执行超时1。删除std::function&lt;int(int)&gt; fn = foo; 将允许成功编译。请随时通过Visual Studio Connect 让 Microsoft 知道,以便他们调查并报告错误。是的,您可能会浪费时间翻阅标准以查看这是否是“合法”代码,但使用错误跟踪器会物有所值。

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

【讨论】:

  • 我不知道ms提供了在线编译器。谢谢你。
【解决方案2】:

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

这失败了:

#include <functional>

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

与:

Microsoft (R) C/C++ 优化编译器版本 19.00.23506 for x64
版权所有 (C) 微软公司。版权所有。

a.cpp
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\type_traits(1348):
    错误 C2065:“_Args”:未声明的标识符
    [...以及更多]

但这有效:

#include <functional>

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

【讨论】:

    猜你喜欢
    • 2016-04-02
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多