C++ lambda应该衰减到模板化代码中的函数指针吗?
我在某处读到,如果捕获列表为空,lambda函数应该衰减为函数指针。我现在能找到的唯一参考资料是。使用g++(4.5和4.6)时,除非在模板代码中声明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++的临时限制吗?如果不
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>()();