constexpr相关内容

变量上的const constexpr是否冗余?

cppreference 指出: 在对象声明或非静态中使用的constexpr说明符成员函数(直到C ++ 14)隐含const. “对象声明"是指“任何变量声明"吗? 即是 constexpr const int someConstant = 3; 等同于 constexpr int someConstant = 3; 在C ++ 11,C ++ 14和C ++ ..
发布时间:2021-04-24 19:17:01 C/C++开发

如果忽略结果,则在编译时不调用Constexpr函数

我正在研究 constexpr 函数的一些相当奇怪的代码覆盖结果(我使用的代码覆盖工具无法检测编译时调用),并注意到一些constexpr 函数被称为 runtime 函数,如果未存储函数调用的结果,则称为 . 似乎,对于 constexpr 函数或方法,如果将调用结果存储在(在运行时变量[emphasis !!!]或 constexpr 中)变量),则该调用是编译时调用(只要参数是编译时) ..
发布时间:2021-04-22 20:43:29 C/C++开发

多成员Construpr结构初始化

我是constexpr的新手,但是,我认为我正在练习的问题很适合编译时计算.这不是为了做家庭作业或任何事情,而只是练习“现代"练习.C ++. 这是我到目前为止所拥有的:标题(prime_app_lib.hpp): //#pragma一次用于现代头文件(.hpp)#pragma一次#include静态constexpr unsigned max_prime = 10000 ..
发布时间:2021-04-20 19:04:04 C/C++开发

在constexpr上下文中验证std :: initializer_list

我有一些我想在编译时由需要某种程度验证的初始化列表初始化的类. 我首先尝试使用static_assert,但是不会编译为“静态声明的非恒定条件"错误. 导致此错误的最佳方法是什么? class foo {上市:constexpr foo(std :: initializer_list项目){for(自动& i:物品){if(i == 12)//验证逻辑示例//编译失败} ..
发布时间:2021-04-20 19:03:13 C/C++开发

C ++ 17中具有非固定基础类型的constexpr静态从int强制转换为作用域枚举的未定义行为

我想知道以下内容是否应该在C ++ 17中编译 枚举类E{A,B};constexpr E x = static_cast(2); 这将在Ubuntu 20.04上同时使用GCC 9.3.0和Clang 10.0.0进行编译. 我的问题是 应该编译吗? 如果应该,为什么? 我认为不应该.关于未定义行为(UB)和枚举的文章很多,但我找不到在常量表达式上下文中引起它的 ..
发布时间:2021-04-20 19:02:38 C/C++开发

从constexpr模板函数调用非constexpr

我偶然发现了调用非constexpr函数的constexpr模板函数:在以下代码段中,由于调用了非constexpr set , bar 无法按预期进行编译,但是 foo 进行了编译.谁能告诉我 foo 编译的原因吗? template无效集(T& x){x ++;}模板constexpr void foo(T& x){设置T(x);}constexpr void ..
发布时间:2021-04-20 18:59:43 C/C++开发

为什么constexpr不是所有函数的默认值?

放宽constexpr的规则后,似乎这些函数可以在任何地方使用.也可以在常量(constexpr)和局部(可变)变量上调用它们.因此对我来说,这似乎只是编译器的提示(如内联).我只是一直在各处编写它,如果编译器抱怨,请将其删除.因此,编译器似乎知道什么都可以在编译时求值.为什么不是默认行为,为什么我必须将任何内容标记为constexpr? 解决方案 constexpr 是接口保证.这意味着 ..
发布时间:2021-04-20 18:56:26 C/C++开发

使用constexpr进行constexpr文字初始化

一个简单的例子: 静态constexpr const charliteral1 [] ="abcde";静态constexpr const char字面量2 [] =字面量1; 编译错误.如何使其工作以及为什么不起作用? 解决方案 更新: 为回应评论,这是修订后的版本. 类 immutable :: string 建模一个类似于constexpr的类似字符串的对象,该对象 ..
发布时间:2021-04-20 18:48:12 C/C++开发

VS2015和GCC 5.4.0中的Constexpr阶乘编译结果

想知道以下情况是否会像我一样使任何人感到惊讶?Alex Allain的文章此处使用constexpr时显示以下阶乘示例: constexpr阶乘(int n){返回n>0?n * factorial(n-1):1;} 并声明: 现在您可以使用阶乘(2),并且在编译器看到它时,它可以优化调用并完全在编译时进行计算时间. 我在VS2015中以发布模式对(/Ox)进行了全面优化,并在 ..
发布时间:2021-04-20 18:47:38 C/C++开发

为什么constexpr必须是静态的?

试图使用constexpr属性创建结构的成员而不是静态的尝试会导致编译器错误(请参见下文).这是为什么?对于单个常数值,我将在内存中保留该值,直到终止程序,而不仅仅是结构范围?我应该回到使用宏吗? struct foo{constexpr int n = 10;//...};错误:非静态数据成员不能为constexpr;您打算使其静态化吗? 解决方案 我不知道官方的合理性.但是可以肯定会 ..
发布时间:2021-04-20 18:42:45 C/C++开发

为什么constexpr不是自动的?

据我所知,constexpr可以看作是编译器的提示,以检查是否可以在编译时对给定的表达式求值. 我知道它也对声明为constexpr的函数或初始化施加了一些限制,但是最终目标是编译时评估,不是吗? 所以我的问题是,为什么我们不能把它留给编译器?它显然可以检查前提条件,那么为什么不对每个表达式都做,并在可能的情况下在编译时求值呢? 对于为什么会出现这种情况,我有两个想法,但是我还不 ..
发布时间:2021-04-20 18:39:14 C/C++开发

警告:函数使用“自动"类型说明符,而没有尾随返回类型

以下代码给出以下警告.有人可以解释一下原因吗(请注意,该代码没有用,因为我用int替换了我的类型以构成一个完整的示例). 警告:" MaxEventSize()"函数使用" auto "类型说明符,而不尾随返回类型[默认启用] 想法是获取特定结构的最大大小(类型在 int 所在的位置). templateconstexpr T cexMax(T a,T b ..
发布时间:2021-04-20 18:37:36 C/C++开发