Lambda constexpr 在 msvc 中有效,但在 gcc 中无效

Ala*_*lan 4 c++ language-lawyer c++20

我编写了以下程序,该程序使用 msvc 编译,但不使用 gcc 和 clang 编译。 演示

int main() {
    constexpr auto func = []()constexpr { return 1; };
    auto i = []{return func();};
}   
Run Code Online (Sandbox Code Playgroud)

我想知道这里的编译器是哪个?

海湾合作委员会 说:

<source>: In lambda function:
<source>:3:28: error: 'func' is not captured
    3 |     auto i = []{return func();};
      |                        ~~~~^~
<source>:3:15: note: the lambda has no capture-default
    3 |     auto i = []{return func();};
      |               ^
<source>:2:20: note: 'constexpr const main()::<lambda()> func' declared here
    2 |     constexpr auto func = []()constexpr { return 1; };
      |
Run Code Online (Sandbox Code Playgroud)

use*_*570 6

MSVC 似乎就在这里。

来自lambda 表达式的文档

captures - 零个或多个捕获的逗号分隔列表,可以选择以捕获默认值开头。

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

  • 具有 const 非易失性整型或枚举类型,并且已使用常量表达式进行初始化,或者
  • 是 constexpr 并且没有可变成员