当前位置: 首页 > 知识库问答 >
问题:

在 lambda 中捕获的 Constexpr 变量失去了其 constexpr-ness

何长恨
2023-03-14

这段代码在g(coliru)中编译得很好,但不能在MSVC(godbolt和我的VS2017)中编译。

#include <type_traits>
#include <iostream>
template<class T> void f(){
    constexpr bool b=std::is_same_v<T,int>; //#1
    auto func_x=[&](){
        if constexpr(b){ //#error
        }else{
        }
    };
    func_x();
}
int main(){
    f<int>();
}

(6):错误C2131:表达式未计算为常量
(6):注意:失败是由读取超出其生命周期的变量
(6)引起的:注意:请参阅“this”的用法

哪一个(g或MSVC)是错误的?
这在“请参阅'这个'的用法”中是什么??

如何在保证编译时间的同时解决它?

在我的实际情况中,b(#1)是一个复杂的语句,它依赖于其他几个constexpr变量。

共有2个答案

顾兴昌
2023-03-14

如何在保持编译时保证的同时解决它?

constexpr bool 标记为静态是一种解决方法

查看演示

或者,您可以在 if constexpr 中使用该条件,而不是将其分配给布尔值。如下所示:

if constexpr(std::is_same_v<T,int>)

查看演示

请注意,MSVC在lambda表达式方面出现了关于constexr的错误。
其中一个是:在lambda
中捕获Constexr的问题,另一个是:在lambda中捕获Constexr的问题

仲法
2023-03-14

gcc是对的。b(作为

如果变量

  • 是constexr并且没有可变成员。

海湾合作委员会直播

似乎如果使< code>b < code > static ,那么MSVC可以访问< code > b 而不被捕获。

template<class T> void f(){
    constexpr static bool b=std::is_same_v<T,int>;
    auto func_x=[](){
        if constexpr(b){
        }else{
        }
    };
    func_x();
}

MSVC实时

而且

如何在保持编译时保证的同时解决它?

我们不能为捕获的变量保持常量。它们成为lambda闭包类型的非静态数据成员,并且非静态数据成员不能是< code>constexpr。

 类似资料:
  • 我想确认这个代码是合法的(还是不合法的?)C++17。 如果用G++和MSVC编译,我不会得到错误(并得到正确的输出), 但Intel和clang给出了一个错误: 使用编译(对于MSVC)。 在godbolt和我的本地机器上尝试了最新的编译器。

  • 以下定义有区别吗? 如果不是,在C++11中首选哪种样式?

  • 我试图在编译时使用C11新的constexpr特性来计算这个简单表达式: 但这是Clang一直告诉我的: 奇怪的是,下面的代码编译得很好: 你们知道为什么a/b不是一个常量表达式吗,我如何在编译时计算它? 将Clang编译器与-std=c1y和-stdlib=libc一起使用 [更新] 以下示例导致了原始代码的错误: 而: 没有。

  • 我使用MSVC v141和< code>/std:c 17进行编译。 编译得很好,而 失败原因: 错误C2131:表达式未计算为常量 失败是由在其生命周期之外读取变量引起的 注意:请参阅“FOO”的用法 这是正确的行为还是 MSVC 中的错误?

  • constexpr-8cc: Compile-time C Compiler constexpr-8cc is a compile-time C compiler implemented as C++14 constant expressions.This enables you to compile while you compile!This project is a port of 8cc

  • 常量表达式机制是为了: 提供一种更加通用的常量表达式 允许用户自定义的类型成为常量表达式 提供了一种保证在编译期完成初始化的方法(可以在编译时期执行某些函数调用) 考虑下面这段代码: enum Flags { good=0, fail=1, bad=2, eof=4 }; constexpr int operator|(Flags f1, Flags f2) { return Flags(int(