C++ 访问lambda表达式中的constexpr变量而不捕获

C++ 访问lambda表达式中的constexpr变量而不捕获,c++,lambda,language-lawyer,c++17,constexpr,C++,Lambda,Language Lawyer,C++17,Constexpr,在下面的示例中,我可以从lambday内部访问constepr变量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 = []{

在下面的示例中,我可以从lambda
y
内部访问
constepr
变量
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);
}
对于捕获/访问,是否有适用于
constexpr
的特殊规则

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

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

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

我很想知道为什么投票会被否决。在我看来,这是标准的一个有趣的角落,几分钟的谷歌搜索没有找到答案。我编辑了这个问题,因为我花了相当长的时间阅读这个问题,才明白为什么
x
的非constexpr声明被标记为
NOK
,直到我阅读了答案,我才明白。希望这能让事情变得更清楚。如果你不同意,请随意回退。如果你还不知道答案,有时很难用直截了当的方式提问。谢谢你澄清了这个问题!对于constexpr,有两个有趣的案例,请看这也适用于