以下代码无法编译:
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数据成员lambda?
答案 0 :(得分:3)
静态数据成员的规则在[class.static.data]中:
如果非易失性
const
static
数据成员是整数或枚举类型,则其在类定义中的声明可以指定大括号或等于初始值其中作为赋值表达式的每个 initializer-clause 是一个常量表达式(5.19)。可以使用static
说明符在类定义中声明文字类型的constexpr
数据成员;如果是这样,其声明应指定大括号或等于初始值 其中 assignment-expression 的每个 initializer-clause 都是一个常量表达式。
只能在类定义中定义static const
整数/枚举类型或constexpr
成员。 C ++ 14禁止constexpr
lambdas时期。 [expr.const]中的措辞用于阅读:
条件表达式e是核心常量表达式,除非根据抽象机器(1.9)的规则评估e将评估以下表达式之一:
- [...]
- lambda-expression (5.1.2);
- [...]
所以在C ++ 14中,你只是不能拥有一个静态的lambda数据成员 - 你不能内联定义它,你不能在线定义它,因为你无法声明它(声明的变量) auto
需要初始化程序。你运气不好。
在C ++ 17中,由于p0170,我们可以拥有constexpr
lambdas,此时您的第二个选项很好:
struct object
{
static constexpr auto f = [](auto&& x){x += 1;};
};