2014-05-21 50 views
2

时,让这个代码讲述的故事(或观看showterm)++ 11编译错误返回值。 我的实际案例涉及更多,但归结起来就是这样。我希望能够使用lambda表达式,但替代方法是使用带有全局变量的普通函数来保存状态。Ç指定拉姆达捕捉

clang++ -std=c++11 testcase.cc 

我使用的是苹果的LLVM:

我与编译

Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 
Target: x86_64-apple-darwin13.1.0 
Thread model: posix 

这是一个错误,还是我做错了什么?

回答

7

当且仅当它不捕获任何东西时,才能将lambda转换为函数指针(bool func (void))。所以第一部分编译但第二部分不会。

您应该使用std::function

#include <functional> 

int foo(std::function<bool(void)> func) { 
    int i; for (i = 0; i < 10 && func(); i++); 
    return i; 
} 

或模板

template <class TFunc> 
int foo(TFunc && func) { 
    int i; for (i = 0; i < 10 && func(); i++); 
    return i; 
} 
+0

就是这样。我不知道我怎么没有找到原来的问题。 –

+0

你会想通过值,“通用引用”或const引用来获取'func';评估一个lambda表达式的结果是一个prvalue,所以'TFunc&'不起作用。 –

+0

@StuartOlsen谢谢。更新。 –