【发布时间】:2012-05-21 17:24:14
【问题描述】:
我试图理解为什么这个 sn-p 失败:
#include <iostream>
using namespace std;
template <typename Lambda>
struct Handler
{
bool _isCompleted;
bool isCompleted() { return _isCompleted; }
Lambda _l;
Handler(Lambda&& l) : _l(l) {}
void call() { _l(this); }
};
int main()
{
auto l1 = new Handler( [&](decltype(l1) obj )->
{
obj->_isCompleted = true;
cout << " is completed?" << obj->isCompleted() << endl;
});
l1->call();
};
g++ 4.5 失败:
test.cpp: In function ‘int main()’:
test.cpp:21:17: error: expected type-specifier before ‘Handler’
test.cpp:21:17: error: expected ‘,’ or ‘;’ before ‘Handler’
test.cpp:25:2: error: expected primary-expression before ‘)’ token
test.cpp:25:2: error: expected ‘;’ before ‘)’ token
test.cpp:26:7: error: request for member ‘call’ in ‘* l1’, which is of non-class type ‘int’
我的理解是 auto l1 应该解析为 Handler<lambdaType>* 并且 lambdaType 应该有一个公共函数签名 void( Handler<LambdaType>*)。我看不出上面的例子有什么明显的错误(你知道,除了 lambda 和处理程序类型之间的丑陋和稍微病态的循环依赖之外)
【问题讨论】:
-
你不是要求你的编译器凭空合成一个类型,除了病态的周期性自依赖之外没有任何具体信息吗?
标签: c++ templates lambda c++11 type-inference