gpt4 book ai didi

c++ - 使用 lambda 作为模板参数时,这个编译器错误是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:11 24 4
gpt4 key购买 nike

编辑:

这已被报告为 Microsoft Connect 上的 VS2012 C++ 编译器错误 (link) .

十一月2014 年 1 月 11 日:Microsoft 已回应称,此错误的修复应该出现在 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

我已完成研究并查找错误消息 ( link ) 的页面,但我仍然无法弄清楚问题出在哪里。你能解释一下这个编译器错误吗?


编辑

这里肯定有什么地方很奇怪。如果我将 main 中的代码更改为如下所示:

auto f = []()
{
int* n = new int(0);
auto g = [=](){ return *n; };
*n++;
return build<decltype(g)>(std::move(g));
};

我收到一条错误消息,提示构建调用中的 T=int (__cdecl *)(void) - 这意味着 decltype(g) 正在给出我是一个函数指针?嗯?我正在按值捕获一个指针,然后在之后修改它 - 它不应该 创建一个仿函数 - 并且没有转换为函数指针的仿函数吗?也许我不明白什么。

参见相关:Lambda expressions : n3290 draft


此外,如果这是 VS2012 编译器中的错误,您能想到解决方法吗?

最佳答案

我可以确认使用 GCC(在 Linux 上),这段代码编译得很好。所以我想说 VisualStudio 似乎是错误的根源。

关于c++ - 使用 lambda 作为模板参数时,这个编译器错误是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16661981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com