以下内容适用于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太宽松了?
答案 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
{
[]{};
};
}