【发布时间】:2012-07-28 09:06:41
【问题描述】:
我正在尝试使用 lambda 作为静态成员,如下所示:
struct A
{
static constexpr auto F = [](){};
};
int main()
{
A::F();
return 0;
}
这甚至是正确的 C++11 代码吗?在铿锵声中,我收到此错误:
error: constexpr variable 'F' must be initialized by a constant
expression
static constexpr auto F = [](){};
^~~~~~
在 clang 中,lambda 似乎不被视为常量表达式。它是否正确?也许他们还没有在 clang 中完全实现 lambda,因为 gcc 4.7 似乎允许它作为 constexpr,但它给出了另一个错误:
error: ‘constexpr const<lambda()> A::F’, declared using local type ‘const<lambda()>’, is used but never defined
我不确定,我明白这意味着什么。它似乎正确地推断出 lambda 的类型,但它只声明它而不定义它。我将如何定义它?
【问题讨论】:
-
我可以非常无助地问,呃,“你到底为什么要这样做?”这种构造会做什么,而普通的成员函数不会?
-
@Rook 保存他以编写返回类型,我们可以将
static constexpr auto噪音扔到宏中。 -
因为 lambdas 的类型推导比成员函数好得多。
-
@Paul:这里的实际问题是您正在使用具有特别疯狂和笨拙的返回类型的函数吗?
-
@Paul:啊,现在这更有意义了。在我看来,这很像您在 C++ 的前沿操作,因此您可能不得不等待编译器赶上您。我注意到 VC++ 2012 甚至还不能管理
constexpr。你正在做的事情并没有看起来违反标准,但我很可能误读了一些东西。
标签: c++ lambda c++11 language-lawyer constexpr