这段代码在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变量。
如何在保持编译时保证的同时解决它?
将 constexpr bool
标记为静态
是一种解决方法。
查看演示
或者,您可以在 if constexpr
中使用该条件,而不是将其分配给布尔
值。如下所示:
if constexpr(std::is_same_v<T,int>)
查看演示
请注意,MSVC在lambda表达式方面出现了关于constexr
的错误。
其中一个是:在lambda
中捕获Constexr的问题,另一个是:在lambda中捕获Constexr的问题
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(