在没有捕获的情况下访问lambda表达式中的constexpr变量

时间:2018-05-09 06:53:02

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

在以下示例中,我可以从lambda constexpr内部访问x变量y,而无需显式捕获它。如果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);
}

1 个答案:

答案 0 :(得分:32)

  

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

是的,constexpr变量无法在lambda中捕获:

  

lambda表达式可以在不捕获的情况下读取变量的值   如果变量

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