【问题标题】:Static (possibly constexpr) data member lambda静态(可能是 constexpr)数据成员 l​​ambda
【发布时间】:2017-03-15 00:50:29
【问题描述】:

以下代码无法编译:

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?

【问题讨论】:

    标签: c++ lambda static c++14 data-members


    【解决方案1】:

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

    如果一个非易失的conststatic数据成员是整数或枚举类型,它在类定义中的声明可以指定一个brace-or-equal-initializer,其中每个initializer-clause 是一个 assignment-expression 是一个常量表达式 (5.19)。可以在类定义中使用 constexpr 说明符声明文字类型的 static 数据成员;如果是这样,它的声明应指定一个 brace-or-equal-initializer 其中,作为 assignment-expression 的每个 initializer-clause 都是常量表达式。

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

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

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


    在 C++17 中,由于 p0170,我们可以拥有 constexpr lambda,此时您的第二个选项就可以了:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-15
      • 2019-07-05
      • 2016-07-03
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 2015-02-25
      • 2016-12-05
      相关资源
      最近更新 更多