编辑:
这被报告为VS2012 C++编译器在Microsoft Connect上的错误 (链接)。
2014年11月11日:微软回应说,此错误的修复应该会出现在下一个主要版本的Visual C++中。
我一直在努力解决我不理解的VS2012编译器错误消息,所以我将问题缩小到了似乎是最少的。
我正在使用VS2012构建以下main.cpp
:
#include <utility>
template <typename T>
struct A
{
T x;
A(A&& other) : x(std::move(other.x)) { }
A(T&& x) : x(std::move(x)) { }
};
template <typename T>
A<T> build(T&& x)
{
return A<T>(std::move(x));
}
int main(int argc, char* argv[])
{
auto f = []()
{
return build([](){}); //error here
};
return 0;
}
要点是我正在尝试使用lambda作为build
函数的模板类型T
。我收到的错误消息是:
1> main.cpp
1>C:\test\main.cpp(21): error C2664: 'A<T>::A(A<T> &&)' : cannot convert parameter 1 from 'A<T>' to 'A<T> &&'
1> with
1> [
1> T=void (__cdecl *)(void)
1> ]
1> and
1> [
1> T=main::<lambda_c3c618d445b3cb24eede9bf304860ad7>::()::<lambda_4240e93016e3e420ff8383c9350ae130>
1> ]
1> and
1> [
1> T=void (__cdecl *)(void)
1> ]
1> Reason: cannot convert from 'A<T>' to 'A<T>'
1> with
1> [
1> T=main::<lambda_c3c618d445b3cb24eede9bf304860ad7>::()::<lambda_4240e93016e3e420ff8383c9350ae130>
1> ]
1> and
1> [
1> T=void (__cdecl *)(void)
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
我已经做过研究并查看了错误信息页面(链接),但我仍然不知道问题出在哪里。你能解释一下这个编译器错误吗?
编辑
这里肯定有些奇怪。如果我更改main
中的代码,让它看起来像这样:
auto f = []()
{
int* n = new int(0);
auto g = [=](){ return *n; };
*n++;
return build<decltype(g)>(std::move(g));
};
我收到一个错误提示信息,建议在调用build时
T=int (__cdecl *)(void)
,这意味着decltype(g)
给我一个函数指针? 嗯? 我通过值捕获指针,然后修改它 - 不应该创建一个没有函数指针转换的函数对象吗? 也许我没有理解清楚。相关内容请参见:Lambda expressions : n3290 draft
此外,如果这是VS2012编译器中的错误,您能想到一种解决方法吗?
[]{}
。这不是问题。 - Xeo