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

wim*_*aan 32 c++ lambda language-lawyer constexpr c++17

在下面的示例中,我可以从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);
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 32

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

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

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

  • 具有const非易失性积分或枚举类型,并已使用常量表达式初始化,或
  • 是constexpr和平凡的复制可构造.