从 lambda 函数获取 constexpr 变量是可以的,但是当此类语句位于新的 lambda 中时,编译会失败(Visual C++)并且罚款(gcc)

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

此代码在 gcc 中编译良好,但在 Visual C++ 中编译失败。

MCVE = https://wandbox.org/permlink/SqNI85EospSrwm5T

int main() {
    auto func_do1Pass2=[&]() {
        return 8;
    };
    constexpr int g=func_do1Pass2();
    auto sLambda=[&]() {
        constexpr int g2=func_do1Pass2();  //<== error at Visual C++
    };
}

错误 C2131 表达式未计算为常量

  1. 谁错了? 为什么? 请给个参考。

  2. 这是我更真实的例子。 在 Visual C++ 情况下以下代码的解决方法是什么?

代码:

void testtt() {
    int localVariable=0; //some local variable
    auto func_do1Pass2=[&]<int s>() {
        if constexpr(s==5){localVariable=7;}
        ///^ may modify some local variables
        return 8;
    };
    [&]<int s2>() {
        ///vvv can edit only here
        constexpr int g2=func_do1Pass2.operator()<s2>();
        ///^^^ can edit only here
    }.operator()<2>();
}
c++ lambda language-lawyer c++20 constexpr
1个回答
0
投票

只需制作

func_do1Pass2
constexpr ,如下所示。

void testtt() {
//--vvvvvvvvv-------------------------------->added constexpr here
    constexpr auto func_do1Pass2=[&]<int s>()  {
        return 8;
    };
    [&]<int s2>() {
        
        constexpr int g2=func_do1Pass2.operator()<s2>();
        
    }.operator()<2>();
}

工作演示

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