在我的几个项目中,以下代码:
#include <functional>
class SmallClass
{
public:
int x1, y1;
void TestFunc()
{
auto BadLambda = [&]()
{
int g = x1 + 1; //ok
int h = y1 + 1; //c2296
int l = static_cast<int>(y1); //c2440
};
int y1_copy = y1; //it works if you create a local copy
auto GoodLambda = [&]()
{
int h = y1_copy + 1; //ok
int l = this->y1 + 1; //ok
};
}
};
生成
错误 C2296:“+”:非法,左操作数的类型为“double (__cdecl *)(double)”
或者
错误 C2440:“static_cast”:无法从“double (__cdecl *)(double)”转换为“int”
你得到图片。如果按价值捕获也会发生这种情况。
该错误似乎与成员名称“y1”有关。它发生在不同的班级、不同的项目中,并且(看似)y1 的任何类型;例如,这段代码:
[...]
MyClass y1;
void TestFunc()
{
auto BadLambda = [&]()->void
{
int l = static_cast<int>(y1); //c2440
};
}
生成这两个错误:
错误 C2440:“static_cast”:无法从“MyClass”转换为“int”没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符
错误 C2440:“static_cast”:无法从“double (__cdecl *)(double)”转换为“int”没有可以进行这种转换的上下文
它似乎与“功能”库相关联。它发生在一个仅包含“功能”的最小项目中(在我的机器上)(是的,它应该在括号之间,但我在 HTML 上失败了)。
这似乎不是一个已知的错误,我不知所措。关于为什么会发生这种情况的任何想法?(我不需要解决方法;代码中已经有一些)。
编辑:确实,它与 math.h 中的函数有关:
_CRT_NONSTDC_DEPRECATE(_cabs) _CRTIMP double __cdecl cabs(In struct _complex _X);
_CRT_NONSTDC_DEPRECATE(_j0) _CRTIMP double __cdecl j0(In double _X);
_CRT_NONSTDC_DEPRECATE(_j1) _CRTIMP double __cdecl j1(In double _X);
_CRT_NONSTDC_DEPRECATE(_jn) _CRTIMP double __cdecl jn(In int _X, In double _Y);
_CRT_NONSTDC_DEPRECATE(_y0) _CRTIMP double __cdecl y0(In double _X);
_CRT_NONSTDC_DEPRECATE(_y1) _CRTIMP double __cdecl y1(In double _X);
_CRT_NONSTDC_DEPRECATE(_yn) _CRTIMP double __cdecl yn(In int _X, In double _Y);
使用这些函数名称中的任何一个都会触发错误。包含 math.h、cmath 或函数时会发生这种情况。也许有人知道这些名称是如何进入我的 lambda 表达式范围的?
编辑:解决了。这是 VS2010(可能还有其他较旧的编译器)中的 lambda 名称解析问题。如果您定义全局名称或使用“使用命名空间 x”,请避免在 lambdas 中使用非限定名称。
使用 Visual Studio 2010 Express 版本 10.0.40219.1 SP1Rel。