Compiling the following code in Visual Studio 2017:
#include "pch.h"
#include <iostream>
int main()
{
int test = 5;
auto cb1 = [test]()
{
auto cb2 = [&]()
{
auto cb3 = [test]()
{
std::cout << test;
};
cb3();
};
cb2();
};
cb1();
}
Run Code Online (Sandbox Code Playgroud)
Gives the compiler error
test.cpp(17): error C2440: '<function-style-cast>': cannot convert from 'const int' to 'main::<lambda_80fd0d4feae1377a5d8b8955e10105ab>::()::<lambda_38fc83ae6a7bd6540ebe1721869db4f1>'
test.cpp(17): note: No constructor could take the source type, or constructor overload resolution was ambiguous
test.cpp(18): error C3536: 'cb2': cannot be used before it is initialized
test.cpp(18): error C2064: term does not evaluate to a function taking 0 arguments
Run Code Online (Sandbox Code Playgroud)
Does anybody know why Visual Studio gives this error? (it seem to compile ok on clang) You can get it to compile by replacing auto cb2 = [&]() with auto cb2 = [&test]() why does that fix the errors?
Even more interesting adding std::cout << test; or const int &ref = test; to the body of cb2 fixes the compiler error.
这只是旧版 Visual Studio 编译器中的一个错误。通过实验可以看到,该错误一直存在到MSVC v16.10,并在MSVC v16.11中修复。幸运的是,包括 Visual Studio 2019 在内的现代编译器接受您的程序。演示: https: //gcc.godbolt.org/z/rYG7Ma8n9
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |