【发布时间】:2017-07-08 09:00:30
【问题描述】:
这是完整的例子:
auto callSelf = [](auto& func) {func(func);};
class wrapper : public decltype(callSelf) {
using base = decltype(callSelf);
public:
wrapper() : base(callSelf) {}
template<class T>
void operator()(T& func) {
base::operator()(func);
}
};
int main()
{
//callSelf(callSelf); // Error
wrapper w;
w(w); // OK, nice endless recursion
}
为什么用wrapper可以,而直接做会导致如下错误?
main.cpp:30: error: use of '<lambda(auto:1&)> [with auto:1 = <lambda(auto:1&)>]' before deduction of 'auto'
auto callSelf = [&](auto& func) {func(func);};
~~~~^~~~~~
【问题讨论】:
-
你没问题的情况应该仍然有一个错误,因为
callSelf有一个捕获,当它不是本地的任何东西时。您将代码简化为引入新错误的示例。 -
@chris 哦,对不起,这里不需要 caputre,正在编辑。但是通过捕获它应该会产生编译时错误或程序格式错误?
-
错误消息告诉您确切的原因。有什么不清楚的地方?
-
@n.m.:该错误消息根本不清楚。
-
@BenjaminLindley 抱歉,我没有深入思考这条消息。您只需通过
auto callself2 = []() { callself2(); }就可以在没有任何通用 lambda 的情况下获得相同的消息“在扣除‘auto’之前”中的auto指的是返回类型。确实不是很清楚。
标签: c++ templates recursion lambda c++14