constexpr相关内容
cppreference 指出: 在对象声明或非静态中使用的constexpr说明符成员函数(直到C ++ 14)隐含const. “对象声明"是指“任何变量声明"吗? 即是 constexpr const int someConstant = 3; 等同于 constexpr int someConstant = 3; 在C ++ 11,C ++ 14和C ++
..
我正在研究 constexpr 函数的一些相当奇怪的代码覆盖结果(我使用的代码覆盖工具无法检测编译时调用),并注意到一些constexpr 函数被称为 runtime 函数,如果未存储函数调用的结果,则称为 . 似乎,对于 constexpr 函数或方法,如果将调用结果存储在(在运行时变量[emphasis !!!]或 constexpr 中)变量),则该调用是编译时调用(只要参数是编译时)
..
以下代码可与gcc和MSVC一起编译,但无法使用我在clang-3.5和当前中继上测试过的clang. 模板constexpr auto错误=假;模板constexpr auto foo(const T t)->整型{static_assert(错误的
..
鉴于 std :: array :: size 是constexpr,在下面的代码段中 Foo1 :: u 不是 static 成员为什么重要?该类型在编译时是已知的,因此它的 size()也是如此. Foo2 :: bigger()有什么问题? 列表: //x86-64 gcc 10.1//-O3 --std = c ++ 20 -pedantic -Wall -We
..
我是constexpr的新手,但是,我认为我正在练习的问题很适合编译时计算.这不是为了做家庭作业或任何事情,而只是练习“现代"练习.C ++. 这是我到目前为止所拥有的:标题(prime_app_lib.hpp): //#pragma一次用于现代头文件(.hpp)#pragma一次#include静态constexpr unsigned max_prime = 10000
..
在我现有的代码库中,我有一个非模板类,其构造函数具有以下声明签名... struct SomeStruct {双a_;双b_;SomeStruct(double a,double b):a_ {a},b_ {b} {}}class SomeClass {私人的:SomeStructfields_;size_t n_;std :: functionfunc_;上
..
我有一些我想在编译时由需要某种程度验证的初始化列表初始化的类. 我首先尝试使用static_assert,但是不会编译为“静态声明的非恒定条件"错误. 导致此错误的最佳方法是什么? class foo {上市:constexpr foo(std :: initializer_list项目){for(自动& i:物品){if(i == 12)//验证逻辑示例//编译失败}
..
我最近写了一些代码,将功能结果打印到 cout .结果本可以在编译时评估,但事实并非如此: #include#includeconstexpr unsigned int gcd(unsigned int u,unsigned int v){//...}int main(){std :: cout
..
我想知道以下内容是否应该在C ++ 17中编译 枚举类E{A,B};constexpr E x = static_cast(2); 这将在Ubuntu 20.04上同时使用GCC 9.3.0和Clang 10.0.0进行编译. 我的问题是 应该编译吗? 如果应该,为什么? 我认为不应该.关于未定义行为(UB)和枚举的文章很多,但我找不到在常量表达式上下文中引起它的
..
我有两个摘要. 第一段代码: #include模板constexpr bool foo(T&){返回false;}int main(){std :: string a;如果constexpr(foo(a)){}} 第二个片段: #include模板constexpr bool foo(T&){
..
我偶然发现了调用非constexpr函数的constexpr模板函数:在以下代码段中,由于调用了非constexpr set , bar 无法按预期进行编译,但是 foo 进行了编译.谁能告诉我 foo 编译的原因吗? template无效集(T& x){x ++;}模板constexpr void foo(T& x){设置T(x);}constexpr void
..
std :: initializer_list 和 std :: array 的 size()成员函数具有相同的签名: constexpr size_type size()const noexcept; 都是 constexpr .但是,可以在 constexpr 上下文中使用 std :: array :: size(),但是可以使用 std :: initializer_list ::
..
放宽constexpr的规则后,似乎这些函数可以在任何地方使用.也可以在常量(constexpr)和局部(可变)变量上调用它们.因此对我来说,这似乎只是编译器的提示(如内联).我只是一直在各处编写它,如果编译器抱怨,请将其删除.因此,编译器似乎知道什么都可以在编译时求值.为什么不是默认行为,为什么我必须将任何内容标记为constexpr? 解决方案 constexpr 是接口保证.这意味着
..
一个简单的例子: 静态constexpr const charliteral1 [] ="abcde";静态constexpr const char字面量2 [] =字面量1; 编译错误.如何使其工作以及为什么不起作用? 解决方案 更新: 为回应评论,这是修订后的版本. 类 immutable :: string 建模一个类似于constexpr的类似字符串的对象,该对象
..
想知道以下情况是否会像我一样使任何人感到惊讶?Alex Allain的文章此处使用constexpr时显示以下阶乘示例: constexpr阶乘(int n){返回n>0?n * factorial(n-1):1;} 并声明: 现在您可以使用阶乘(2),并且在编译器看到它时,它可以优化调用并完全在编译时进行计算时间. 我在VS2015中以发布模式对(/Ox)进行了全面优化,并在
..
我编写了以下代码来测试constexpr阶乘评估与正常方式所花费的时间 #include#includeconstexpr long int factorialC(long int x){return x *(x std :: integral_constant .您可以改用它.
..
试图使用constexpr属性创建结构的成员而不是静态的尝试会导致编译器错误(请参见下文).这是为什么?对于单个常数值,我将在内存中保留该值,直到终止程序,而不仅仅是结构范围?我应该回到使用宏吗? struct foo{constexpr int n = 10;//...};错误:非静态数据成员不能为constexpr;您打算使其静态化吗? 解决方案 我不知道官方的合理性.但是可以肯定会
..
据我所知,constexpr可以看作是编译器的提示,以检查是否可以在编译时对给定的表达式求值. 我知道它也对声明为constexpr的函数或初始化施加了一些限制,但是最终目标是编译时评估,不是吗? 所以我的问题是,为什么我们不能把它留给编译器?它显然可以检查前提条件,那么为什么不对每个表达式都做,并在可能的情况下在编译时求值呢? 对于为什么会出现这种情况,我有两个想法,但是我还不
..
我有几种类型,我想在编译时将 std :: integral_constant 顺序ID值“绑定"到每种类型. 示例: struct Type00 {};struct Type01 {};struct Type02 {};struct Type03 {};struct TypeXX {};struct TypeYY {};templatestruct TypeI
..
以下代码给出以下警告.有人可以解释一下原因吗(请注意,该代码没有用,因为我用int替换了我的类型以构成一个完整的示例). 警告:" MaxEventSize()"函数使用" auto "类型说明符,而不尾随返回类型[默认启用] 想法是获取特定结构的最大大小(类型在 int 所在的位置). templateconstexpr T cexMax(T a,T b
..