raf*_*fak 9 c++ lambda templates function-pointers c++11
我在某处读到,如果捕获列表为空,则lambda函数应衰减为函数指针.我现在唯一能找到的参考是n3052.使用g ++(4.5和4.6)它可以按预期工作,除非lambda在模板代码中声明.
例如,以下代码编译:
void foo() {
void (*f)(void) = []{};
}
Run Code Online (Sandbox Code Playgroud)
但它在模板化时不再编译(如果foo在其他地方实际调用):
template<class T>
void foo() {
void (*f)(void) = []{};
}
Run Code Online (Sandbox Code Playgroud)
在上面的参考中,我没有看到这种行为的解释.这是g ++的临时限制,如果没有,是否有(技术)理由不允许这样做?
我想不出有什么理由明确禁止这样做。我猜这只是 g++ 的临时限制。
我还尝试了其他一些事情:
template <class T>
void foo(void (*f)(void)) {}
foo<int>([]{});
Run Code Online (Sandbox Code Playgroud)
这样可行。
typedef void (*fun)(void);
template <class T>
fun foo() { return []{}; } // error: Cannot convert.
foo<int>()();
Run Code Online (Sandbox Code Playgroud)
那不是(但如果foo没有参数化的话)。
注意:我只在 g++ 4.5 中进行了测试。
| 归档时间: |
|
| 查看次数: |
949 次 |
| 最近记录: |