2015-12-13 69 views
0

用gcc 5.2和3.7铿锵下面的作品,但失败MSVC 2015年:MSVC的std ::功能无法嵌套拉姆达接受通用拉姆达

#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和铿锵过于松懈?

+0

Visual Studio中的哪个版本? –

+0

vs2015 Nubcase

+2

如果将其更改为'auto const foo = [](auto && i) - > int {' – melak47

回答

2

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

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

+2

我不知道ms提供了一个在线编译器。感谢那。 – Nubcase

0

这是在Visual C++ 2015中的a bug,但它似乎已修复为更新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.0\VC\INCLUDE\type_traits(1348): 
    error C2065: '_Args': undeclared identifier 
    [...and more]

但这个工程:

#include <functional> 

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