3

以下代码无法编译:

struct object 
{
    static constexpr auto f;
};

constexpr auto object::f = [](auto&& x){x += 1;};

这一个都不是:

struct object 
{
    static constexpr auto f = [](auto&& x){x += 1;};
};

但这确实(当f不是成员时):

static constexpr auto f = [](auto&& x){x += 1;};

有没有办法在 C++14 中声明和定义静态 constexpr 数据成员 l​​ambda?

4

1 回答 1

4

静态数据成员的规则在 [class.static.data] 中:

如果非易失性const static数据成员是整数或枚举类型,则其在类定义中的声明可以指定一个大括号或相等初始化器,其中作为赋值表达式的每个初始化器子句都是一个常量表达式(5.19)。字面量类型的数据成员可以用说明符在类定义中声明;如果是这样,它的声明应指定一个大括号或等式初始化器,其中作为赋值表达式的 每个初始化器子句都是一个常量表达式。staticconstexpr

只能在类定义中定义static const整数/枚举类型或成员。constexprC++14 不允许constexpr使用 lambda 句点。[expr.const] 中的措辞过去是:

条件表达式 e 是核心常量表达式,除非根据抽象机 (1.9) 的规则对 e 的求值将求值以下表达式之一:
— [...]
lambda 表达式(5.1.2 );
— [...]

所以在 C++14 中,你不能有一个静态 lambda 数据成员——你不能内联定义它,你不能定义它,因为你没有办法声明它(用auto需要声明的变量初始化器)。你运气不好。


constexpr在 C++17 中,由于p0170,我们可以使用lambda ,此时您的第二个选项很好:

struct object 
{
    static constexpr auto f = [](auto&& x){x += 1;};
};
于 2017-03-15T01:06:15.193 回答