Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ lambda应该衰减到模板化代码中的函数指针吗?_C++_Templates_Lambda_C++11_Function Pointers - Fatal编程技术网

C++ lambda应该衰减到模板化代码中的函数指针吗?

C++ lambda应该衰减到模板化代码中的函数指针吗?,c++,templates,lambda,c++11,function-pointers,C++,Templates,Lambda,C++11,Function Pointers,我在某处读到,如果捕获列表为空,lambda函数应该衰减为函数指针。我现在能找到的唯一参考资料是。使用g++(4.5和4.6)时,除非在模板代码中声明lambda,否则它将按预期工作 例如,编译以下代码: void foo() { void (*f)(void) = []{}; } 但是当模板化时,它不再编译(如果在别处实际调用了foo): 模板 void foo(){ 无效(*f)(无效)=[]{}; } 在上面的参考资料中,我看不到对这种行为的解释。这是g++的临时限制吗?如果不

我在某处读到,如果捕获列表为空,lambda函数应该衰减为函数指针。我现在能找到的唯一参考资料是。使用g++(4.5和4.6)时,除非在模板代码中声明lambda,否则它将按预期工作

例如,编译以下代码:

void foo() {
    void (*f)(void) = []{};
}
但是当模板化时,它不再编译(如果在别处实际调用了
foo
):

模板
void foo(){
无效(*f)(无效)=[]{};
}

在上面的参考资料中,我看不到对这种行为的解释。这是g++的临时限制吗?如果不是,是否有(技术)理由不允许这样做?

我想不出任何理由明确禁止这样做。我猜这只是g++的一个暂时限制

我还尝试了其他一些方法:

template <class T>
void foo(void (*f)(void)) {}

foo<int>([]{});
模板
void foo(void(*f)(void)){
foo([]{});
这很有效

typedef void (*fun)(void);

template <class T>
fun foo() { return []{}; } // error: Cannot convert.

foo<int>()();
typedef void(*fun)(void);
模板
fun foo(){return[]{};}//错误:无法转换。
foo()();
这不会(但如果
foo
未参数化,则会)


注意:我只在g++4.5中进行了测试。

是的,在第一种情况下,lambda是在代码的非模板部分声明的(尽管它由模板函数使用)。当lambda在模板类中声明时,同样的问题也会发生。请注意,您引用的N3052确实被合并到了C++0x FCD(N3092 5.1.2/6)中。Visual C++ 2010根本不实现转换(不奇怪,因为语言允许在VC++发布之前这么快就被纳入标准)。我已经在微软Connect上提交了一个关于James Noob的bug报告(虽然我预计它不会被固定到下一个Visual C++的发布):正如FYI:上面的代码没有一个在英特尔C++ 111ITS中支持,GCCS BugTrac,尽管现在未确认:@ Salk问题(也向提问者)。假设lambda集合的函数指针捕获列表是空的,那么我们是否可以在不使用std::function的情况下将其存储在容器中(对于我遇到的情况来说很昂贵?这已经是两年的遗憾了,只是无意中发现了这一页,很好奇。。。
typedef void (*fun)(void);

template <class T>
fun foo() { return []{}; } // error: Cannot convert.

foo<int>()();