【发布时间】:2011-04-18 03:40:55
【问题描述】:
如何使用 lambda 表达式作为模板参数?例如。作为初始化 std::set 的比较类。
以下解决方案应该有效,因为 lambda 表达式仅创建一个匿名结构,它应该适合作为模板参数。但是,会产生很多错误。
代码示例:
struct A {int x; int y;};
std::set <A, [](const A lhs, const A &rhs) ->bool {
return lhs.x < rhs.x;
} > SetOfA;
错误输出(我使用的是 g++ 4.5.1 编译器和 --std=c++0x 编译标志):
error: ‘lhs’ cannot appear in a constant-expression
error: ‘.’ cannot appear in a constant-expression
error: ‘rhs’ cannot appear in a constant-expression
error: ‘.’ cannot appear in a constant-expression
At global scope:
error: template argument 2 is invalid
这是预期的行为还是 GCC 中的错误?
编辑
正如有人指出的那样,我错误地使用了 lambda 表达式,因为它们返回了他们所指的匿名结构的 instance。
但是,修复该错误并不能解决问题。我收到以下代码的lambda-expression in unevaluated context 错误:
struct A {int x; int y;};
typedef decltype ([](const A lhs, const A &rhs) ->bool {
return lhs.x < rhs.x;
}) Comp;
std::set <A, Comp > SetOfA;
【问题讨论】:
-
我将其标记为 c++0x。它似乎更合适,应该得到更好的答案。
-
@JoshD 它不应该也被标记为“c++”吗? 0x 最终将成为新标准,我不希望未来的人们错过这个问题,因为他们忘记了正确的标签是 c++0x 而不是 c++。 (或者,是否会在某个时候将所有 c++0x 标签迁移到 c++?)
标签: c++ templates c++11 lambda