constexpr相关内容

编译器如何知道C++常量计算不会触发未定义的行为?

C++标准要求编译器在C++常量计算中检查未定义的行为。 在this talk中,Chandler Carruth指出,在检查UB时“您将耗尽检测错误的能力”,而且在一般情况下,检测UB与halting problem相关,因此可以证明无法确定。 他指的不是conexpr中的UB,但conexpr计算从C++14开始就像常规程序一样通用,因此这仍然适用。 那么,当编译器无法确定程 ..
发布时间:2022-09-20 20:42:35 C/C++开发

C++20 P0784R7非瞬时分配太脆弱vs.P1004R2常量表达式std::VECTOR

我想在C++20中创建一个广泛的constexpr数据存储库。数以万计的本机C++对象作为&q;文本段&即请求分页加载到进程中并在实例之间共享(生成代码)。 对象相互引用,需要通过各种属性、交叉引用等进行索引,所有这些都希望在编译时完成。这需要constexpr(关联)容器,但不能使用模板化(按大小、散列大小等)完成。容器,因为一切都需要保持多态。 首先这似乎是不可能的,因为C++20 ..
发布时间:2022-05-16 22:16:05 C/C++开发

使用consteval而不是conexpr函数有什么好处?

我知道需求的不同,我最感兴趣的是它带来的代码质量带来的好处。 我能想到的几件事: 读者只需阅读函数签名即可知道该函数是在编译时计算的 编译器可能会发出较少的代码,因为constevalFN从不在运行时使用(这只是推测,我没有这方面的真实数据) 不需要有变量来强制ctfe,最后的示例 注意:如果代码质量太模糊,我理解有些人可能想结束这个问题,对我来说,代码质量并不是那个模糊的术 ..
发布时间:2022-05-16 18:39:59 C/C++开发

Std::Memcpy即使在C++20中也不是常量的原因是什么?

我知道,在编译时复制任意内存块并不总是可能的,但既然我们得到了stexpr常量、虚方法和算法,为什么不能也复制emcpy呢?它也是一种算法。 更多, C++20std::bit_cast看起来很像std::memcpy解决办法reinterpret_cast,但它确实是constexpr。 std::copy对于C++20,使用迭代器被标记为constexpr,因此可以以某种方式复制 ..
发布时间:2022-05-16 14:51:38 C/C++开发

C++20 constexpr 容器将如何工作?

作为 constexpr std::字符串和constexpr std::vector 已被 C++20 接受,这些将如何使用?链接的论文在细节上非常短.我们是否需要指定特殊的 constexpr 分配器,使编译时字符串/向量与其正常等效项不兼容? 解决方案 这两篇论文严重依赖P0784,其中讨论了编译时分配的工作方式. 不完整的答案: 只有 std::allocator 可以 ..
发布时间:2022-01-24 20:49:29 C/C++开发

constexpr 用指针初始化

我正在尝试使用指向 int 的指针初始化 constexpr 声明,该指针是一个 const 对象.我也尝试用非 const 类型的对象来定义对象. 代码: #include 主函数(){constexpr int *np = nullptr;//np 是一个指向 null 的 int 常量;整数 j = 0;constexpr int i = 42;//i 的类型是 ..
发布时间:2022-01-23 23:57:14 C/C++开发

const vs constexpr 变量

以下定义有区别吗? const double PI = 3.141592653589793;constexpr 双 PI = 3.141592653589793; 如果不是,C++11 中首选哪种风格? 解决方案 我相信是有区别的.让我们重命名它们,以便我们可以更轻松地讨论它们: const double PI1 = 3.141592653589793;constexpr 双 PI2 ..
发布时间:2022-01-23 23:04:07 C/C++开发

静态类成员的初始化.为什么是 constexpr?

当我想要一个静态指针作为类的成员时,我需要 constexpr 来使用 nullptr 进行初始化. 类应用程序{私人的:constexpr 静态 Application* app = nullptr;} 谁能解释我为什么需要这样做?我找不到静态变量必须在编译时存在的确切原因. 解决方案 那是因为你在类定义中初始化它.这只允许用于常量整数和枚举类型(总是)和 constexpr 数据成 ..
发布时间:2022-01-19 00:08:05 C/C++开发

Consexpr 与宏

我应该在哪里使用 macros,我应该在哪里使用 constexpr?不是基本一样吗? #define MAX_HEIGHT 720 对 constexpr unsigned int max_height = 720; 解决方案 他们不是基本一样吗? 没有.绝对不.甚至没有关闭. 除了你的宏是一个 int 而你的 constexpr unsigned 是一个 unsign ..
发布时间:2022-01-11 19:36:25 C/C++开发

类静态 constexpr 的 C++ 链接器错误

我正在用 g++-4.6.1 --std=c++0x 编译以下简单程序: #include 结构 S{静态 constexpr int X = 10;};主函数(){返回 std::min(S::X, 0);}; 我收到以下链接器错误: /tmp/ccBj7UBt.o:在函数“main"中:scratch.cpp:(.text+0x17): 未定义的对 `S::X' 的引用colle ..
发布时间:2022-01-11 15:05:36 C/C++开发

何时以及为何将静态与 constexpr 结合使用?

作为免责声明,我在询问之前已经对此进行了研究.我发现了一个类似的问题,但那里的答案感觉有点“稻草人"并没有真正为我个人回答这个问题.我还提到了我方便的 cppreference 页面 但这并没有提供大多数时候对事情的解释非常“愚蠢". 基本上我仍然在加强 constexpr,但目前我的理解是它需要在编译时评估表达式.由于它们可能仅在编译时存在,因此它们在运行时不会真正拥有内存地址.因此,当我 ..
发布时间:2022-01-05 20:13:49 C/C++开发

C++17 之前/之后的 constexpr 静态成员

据我所知,一个很常见的情况是这样的 template班级{上市:静态 constexpr int I = i;静态 constexpr int J = constexprFunction(i);//进一步的类实现}; 几乎和我一样常见的错误(实际上我在这里的大部分问题都是因为我忘记了它并且不知道正确的问题是什么)如果成员被 odr 使用,则忘记了附加定义: templateconstexpr ..
发布时间:2022-01-05 20:04:41 C/C++开发

函数内的静态 constexpr 变量有意义吗?

如果我在一个函数中有一个变量(比如一个大数组),将它同时声明为 static 和 constexpr 是否有意义?constexpr 保证数组是在编译时创建的,那么 static 会无用吗? void f() {静态 constexpr int x [] = {//几千个元素};//对数组做一些事情} static 在生成的代码或语义方面真的在做什么吗? 解决方案 简短的回答是 sta ..
发布时间:2022-01-05 20:03:49 C/C++开发