嵌套 lambda 中的本地 constexpr 隐式捕获失败无法在 msvc 上编译

问题描述 投票:0回答:1

在处理这个问题时,一个可能的答案暗示了嵌套的 lambda,其中内部的 lambda 隐式捕获了外部的

constexpr
局部变量。这是一个mre:

int main() {
    []() {
        // must be declared static with msvc
        constexpr int i = []() { return 42; }();
        []() { static_assert(i == 42); }();
    }();
    return 0;
}

直播 gcc 和 clang 都可以,但是 msvc 有问题

error C3493: 'i' cannot be implicitly captured because no default capture mode has been specified

msvc 仅接受声明变量的代码
static

什么编译器是正确的以及为什么?

c++ lambda language-lawyer cl
1个回答
0
投票

i
中的
i == 42
不是按照 [basic.def.odr]/5.2 的 odr 使用。非正式地,因为您在表达式中仅使用 i
,而不是其作为对象的身份,并且该变量可在常量表达式中使用,即它的值是编译时已知的(因为该变量是声明的
 constexpr
)。

因为

i
没有odr使用,所以不需要捕获它。

© www.soinside.com 2019 - 2024. All rights reserved.