代码之家  ›  专栏  ›  技术社区  ›  cppBeginner

从lambda函数中获取constexpr变量是可以的,但当这样的语句位于新的lambda中时,编译失败(Visual C++)和编译失败(gcc)是可以的

  •  1
  • cppBeginner  · 技术社区  · 11 月前

    此代码在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() {
        auto func_do1Pass2=[&]<int s>() {
            return 8;
        };
        [&]<int s2>() {
            ///vvv can edit only here
            constexpr int g2=func_do1Pass2.operator()<s2>();
            ///^^^ can edit only here
        }.operator()<2>();
    }
    
    2 回复  |  直到 11 月前
        1
  •  1
  •   user12002570    11 月前

    只要做 func_do1Pass2 constexpr如下所示。问题是,在给定的代码中 func_do1Pass2 它不是constexpr,因此不能在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>();
    }
    

    Working demo

        2
  •  0
  •   yinchunxiang    11 月前

    我们可以删除该行的constexpr吗 constexpr int g2=func_do1Pass2.operator()<s2>();

    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int main(){
        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
            int g2=func_do1Pass2.operator()<s2>();
            ///^^^ can edit only here
        }.operator()<2>();
    }
    

    工作演示: https://godbolt.org/z/rqPEr4qee

    如果删除编译参数 /permissive- ,以下代码可以成功编译。

    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int main(){
        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
            const int g2=func_do1Pass2.operator()<s2>();
            ///^^^ can edit only here
        }.operator()<2>();
    }
    

    工作演示: https://godbolt.org/z/5jTq835x5