msvc std :: function不接受带有嵌套lambda的泛型lambda

时间:2015-12-13 04:43:34

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

以下内容适用于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太宽松了?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

这在Visual C ++ 2015中是a bug,但从Update 3开始似乎已经修复。解决方法是指定外部lambda的返回类型(感谢melak47)。< / p>

这失败了:

#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.0\VC\INCLUDE\type_traits(1348):
    error C2065: '_Args': undeclared identifier
    [...and more]

但这有效:

#include <functional>

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