如何将lambda表达式作为模板参数使用?例如,作为初始化std::set的比较类。
以下解决方案应该有效,因为lambda表达式仅创建一个匿名结构体,这应该适合作为模板参数。但是,会产生许多错误。
代码示例:
以下解决方案应该有效,因为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的bug?
编辑
正如有人指出的那样,我错误地使用了lambda表达式,因为它们返回所引用的匿名结构体的实例。
然而,修复该错误并不能解决问题。对于以下代码,我会得到“在未求值的上下文中使用了lambda表达式”的错误: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;