【问题标题】:Access to constexpr variable inside lambda expression without capturing在不捕获的情况下访问 lambda 表达式中的 constexpr 变量
【发布时间】:2018-10-19 04:57:57
【问题描述】:

在以下示例中,我可以从 lambda y 内部访问 constexpr 变量 x,而无需显式捕获它。如果x 未声明为constexpr,则这是不可能的。

是否有适用于constexpr 捕获的特殊规则?

int foo(auto l) {
    // OK
    constexpr auto x = l();
    auto y = []{return x;};
    return y();

    // NOK
    // auto x2 = l();
    // auto y2 = []{ return x2; };
    // return y2();        
}

auto l2 = []{return 3;};

int main() {
    foo(l2);
}

【问题讨论】:

  • 很想知道为什么投反对票。对我来说,这看起来是标准的一个有趣的角落,几分钟谷歌搜索没有找到答案。
  • 我编辑了这个问题,因为我花了很长时间阅读这个问题才能理解为什么 x 的非 constexpr 声明被标记为 NOK,直到我阅读了回答。希望这能让它更清楚。如果您不同意,请随时回滚。
  • 如果您还不了解分析器,有时很难以直截了当的方式提出问题。感谢您澄清问题!
  • constexpr 有几个有趣的案例,请参阅Understanding the example on lvalue-to-rvalue conversion

标签: c++ lambda language-lawyer c++17 constexpr


【解决方案1】:

是否有适用于constexpr 用于捕获/访问的特殊规则?

是的,constexpr 变量可以在不捕获 lambda 的情况下被读取:

lambda 表达式可以读取变量的值而无需捕获 它如果变量

  • 具有 const 非易失性整数或枚举类型并已使用常量表达式初始化,或者
  • 是 constexpr 并且可以简单地复制构造。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2019-08-03
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    相关资源
    最近更新 更多