问题标签 [constexpr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
5639 浏览

c++ - is_constexpr 在 C++11 中是否可行?

是否可以根据 C++11 表达式是否是 C++11 中的常量表达式(即constexpr)来生成编译时布尔值?关于 SO 的一些问题与此有关,但我在任何地方都没有看到直接的答案。

0 投票
4 回答
19340 浏览

c++ - 在编译时使用 Constexpr 填充数组

我想使用 constexpr 填充枚举数组。数组的内容遵循一定的模式。

我有一个枚举,将 ASCII 字符集分为四类。

我想要一个 128 的数组Type。它们可以在一个结构中。数组的索引将对应于 ASCII 字符,值将是Type每个字符的值。

所以我可以查询这个数组来找出一个 ASCII 字符属于哪个类别。就像是

我想知道如果没有一些冗长的宏黑客这是否可能。

目前,我通过执行以下操作来初始化表。

INITIALIZE一些非常冗长的宏黑客的入口点在哪里。就像是

我想要一种方法来填充这个数组或包含数组的结构,而不需要这个宏黑客......

也许像

所以,问题是如何写这个MagicFunction

注意:我知道 cctype 和 likes,这个问题更多的是 aIs this possible?而不是Is this the best way to do it?.

任何帮助,将不胜感激。

谢谢,

0 投票
1 回答
129 浏览

c++ - 使用 C++ 进行 const 初始化

在以下方面有什么区别:

唯一的区别是 const int a 存储在 bss 部分中,而 const int b 不是,并且两者仍然由编译器强制执行。

因此,既然 a in 存储在 bss 中,它会更快吗?由于 a 中的 const 是计算的编译时间,这是 constexpr 的用例吗?constexpr 会使 const in b 存储在 bss 部分中吗?

布莱尔

0 投票
4 回答
150841 浏览

c++ - const vs constexpr 变量

以下定义有区别吗?

如果不是,C++11 中首选哪种风格?

0 投票
2 回答
727 浏览

c++ - 为什么这个 constexpr 代码会导致 GCC 吃掉我所有的 RAM?

以下程序将调用fun 2 ^ (MAXD + 1) 次。不过,最大递归深度不应该超过 MAXD(如果我的想法是正确的)。因此编译可能需要一些时间,但它不应该吃掉我的 RAM。

问题是吃我的内存正是它的作用。当我将 MAXD 提高到 30 时,我的笔记本电脑在 GCC 4.7.2 快速分配 3 GB 左右后开始交换。我还没有尝试使用 clang 3.1,因为我现在无法访问它。

我唯一的猜测是,这与 GCC 试图过于聪明并记住函数调用有关,就像它对模板所做的那样。如果是这样,他们没有限制他们做多少记忆似乎并不奇怪,比如 MRU 缓存表的大小或其他什么?我还没有找到禁用它的开关。

我为什么要这样做?我正在考虑制作一个高级编译时库的想法,比如基因编程之类的。由于编译器没有编译时尾调用优化,我担心任何循环都需要递归并且(即使我调高最大递归深度参数,这看起来有点难看)会快速分配我所有的 RAM 并填充它带有毫无意义的堆栈帧。因此,我想出了上述解决方案,用于在没有深堆栈的情况下获得任意多个函数调用。这样的功能可用于折叠/循环或蹦床。

编辑:现在我已经在clang 3.1中尝试过了,它根本不会泄漏内存,无论我让它工作多长时间(即我做MAXD多高)。CPU 使用率几乎是 100%,内存使用率几乎是 0%,正如预期的那样。也许这只是 GCC 中的一个错误。

0 投票
2 回答
6453 浏览

c++ - 编译时等效的 std::cout,或 c++11 中编译时常量值的 static_assert 字符串化

有没有办法在编译时打印 aconstexpr或d 值的值?#define我想要相当于std::cout <<, 或某种方式来做类似的事情

编辑:我可以用 s 做一些基本的编译时打印constexpr,至少在 gcc 上做一些类似的事情

这给了我error: incomplete type ‘display_non_zero_int_value<1>’ used in nested name specifier static_assert(v == 0 && display_non_zero_int_value<v>::foo, "v == 0");。(另一方面,icpc 不太有用,只是说error: incomplete type is not allowed)有没有办法编写一个可以概括这一点的宏,以便我可以做类似的事情

并以某种方式收到涉及 4 的错误消息?

0 投票
2 回答
2433 浏览

c++ - Lambda 捕获 constexpr 对象

GCC 4.7.2 编译这个:

但不是这个:

根据 C++11 §5.1.2/15,后一个示例对我来说似乎是正确的:

如果实体被隐式或显式捕获但未通过副本捕获,则通过引用捕获实体。对于通过引用捕获的实体,是否在闭包类型中声明了其他未命名的非静态数据成员,这是未指定的。

似乎ilambda 内捕获的对象是指封闭范围内的变量constexpr,而不仅仅是一个const引用。

该标准明确指出,按值捕获的使用被转换为对 lambda 对象的相应成员的使用。而且我认为 5.1.2 暗示我的解释是正确的。

有什么明确说明引用捕获是指封闭范围内的对象还是引用?

0 投票
1 回答
664 浏览

c++ - 这个 constexpr 整数不是空指针常量吗?

考虑以下 C++11 程序及其在 GCC 4.7.2 中的结果:

根据标准:

[C++11: 4.10/1]:空指针常量是整数类型的整数常量表达式 (5.19) prvalue,其计算结果为零 [.. ]

5.19 是一团糟,我未能完全解析它,但我们难道不希望i满足这个标准并充当空指针常量,因此不需要显式转换int*为 的初始化p

如果我s/constexpr/const/使用-ansi而不是编译,则编译成功-std=c++11

0 投票
1 回答
8099 浏览

c++ - constexpr 用指针初始化

我正在尝试使用指向 int 的指针初始化 constexpr 声明,该指针是一个 const 对象。我还尝试使用非 const 类型的对象来定义对象。

代码:

g++ 日志:

我相信这是因为 main 中的对象没有固定地址,因此 g++ 正在向我抛出错误消息;我将如何纠正这个?不使用文字类型。

0 投票
4 回答
716 浏览

c++ - 它在 C++11 标准中的什么地方指定了在翻译过程中何时可以评估 constexpr 函数?

仅仅因为一个函数(或构造函数)......

  • 被声明为 constexpr 并且
  • 函数定义满足 constexpr 要求

...并不意味着编译器将在翻译期间评估 constexpr 函数。我一直在查看 C++11 FDIS(N3242,可在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/获得)试图确定两件事:

  • 编译器何时有义务在翻译期间评估 constexpr 函数?
  • 何时允许编译器在翻译期间评估 constexpr 函数?

第 5.19 节第 1 段说常量表达式可以在翻译过程中求值。据我所知,第 5.19 节的其余部分阐述了 constexpr 函数定义中的有效规则。

我知道我可以在翻译期间通过将 constexpr 函数的结果声明为 constexpr 来强制进行 constexpr 评估。像这样:

到目前为止,我一直无法在 FDIS 中找到以下段落:

  • 强制twoEulers在翻译过程中进行评估或
  • 指定编译器在翻译期间可能或必须评估 constexpr 函数的其他情况。

我特别感兴趣的发现是翻译期间的 constexpr 评估是否由以下因素触发:

  1. 当传递给 constexpr 函数的所有参数都是文字时,或者
  2. 重载决议期间隐含的对象参数(第 13.3.1 节第 3 段)是 constexpr 或需要文字(例如对于数组维度),或者
  3. 完全不同的东西。

如果可能,请在您的回复中引用我可以查找的 FDIS 部分或我可以在 FDIS 中搜索的关键短语。标准中的英语有些迟钝,所以我可能一直在阅读相关段落,完全错过了它们的含义或意图。