问题标签 [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 投票
1 回答
742 浏览

c++ - 是否有替换 X 宏的模板/constexpr/C++11 方式?

有没有办法使用 C++11 功能替换Xmacro习语,最好不使用预处理器?我在想可以使用元组模板,但我仍在尝试了解这些模板是如何工作的。

0 投票
8 回答
12614 浏览

c++ - constexpr 重载

相关:返回 constexpr 的函数无法编译

我觉得 constexpr 在 C++11 中的用处有限,因为无法定义两个函数,否则它们将具有相同的签名,但一个是 constexpr,另一个不是 constexpr。换句话说,如果我可以拥有一个仅接受 constexpr 参数的 constexpr std::string 构造函数,以及一个用于非 constexpr 参数的非 constexpr std::string 构造函数,那将非常有帮助。另一个例子是理论上复杂的函数,可以通过使用状态来提高效率。你不能用 constexpr 函数轻易做到这一点,所以你有两个选择:如果你传入非 constexpr 参数,则有一个非常慢的 constexpr 函数,或者完全放弃 constexpr (或编写两个单独的函数,但您可能不知道要调用哪个版本)。

因此,我的问题是:

符合标准的 C++11 实现是否有可能允许基于 constexpr 的参数进行函数重载,或者这是否需要更新标准?如果不允许,是不是故意不允许的?


@NicolBolas:假设我有一个将 an 映射enum到 a的函数std::string。假设我enum0to 开始,最直接的方法是创建一个大小为结果n - 1的数组。n

我可以创建一个static constexpr char const * []并在返回时构造一个std::string(支付std::string每次调用函数时创建对象的成本),或者我可以创建一个static std::string const []并返回我查找的值,在std::string我第一次支付所有构造函数的成本调用函数。似乎更好的解决方案是std::string在编译时创建内存中(类似于现在使用 所做的char const *),但这样做的唯一方法是提醒构造函数它有constexpr参数。

对于构造函数以外的示例std::string,我认为找到一个示例非常简单,如果您可以忽略constexpr(并因此创建非constexpr函数)的要求,则可以创建更有效的函数。考虑这个线程:constexpr 问题,为什么这两个不同的程序使用 g++ 在如此不同的时间内运行?

如果我fibconstexpr参数调用,我不能比编译器完全优化函数调用做得更好。但是,如果我fib使用非constexpr参数调用,我可能希望它调用我自己的版本,该版本实现了诸如 memoization 之类的东西(这将需要状态),所以我得到的运行时间类似于我传递constexpr参数时的编译时间.

0 投票
2 回答
347 浏览

c++ - Consexpr 变量在 Lambda 中显示为未初始化

在下面的代码示例中,我希望输出如下,因为x它是一个static constexpr变量。

但是,当我使用 编译时,g++ 警告我x在 lambda 函数内部未初始化-Wall,并且输出的最后三行有所不同,可能是因为正在打印堆栈上未初始化内存的值。这是程序在使用 options 编译时产生的一种可能的输出-Wall -std=c++0x。为什么输出不是我期望的那样?

如果有帮助,则constexpr在声明中删除时会产生预期的输出constexpr T x

示例程序

0 投票
4 回答
10095 浏览

c++ - C++11 constexpr 函数的参数传入模板参数

这曾经在几周前起作用:

但现在g++ -std=c++0x说:

clang++ -std=c++11表示模板的参数tfunc<T, t>()因为无效而被忽略。

这是一个错误,还是一个修复?

PS:

g++ --version=>g++ (GCC) 4.6.2 20120120 (prerelease)

clang++ --version=> clang version 3.0 (tags/RELEASE_30/final)(3.0.1)

0 投票
2 回答
4076 浏览

c++ - 带有字符串操作的 constexpr 解决方法?

这个先前回答的问题解释了为什么我在下面发布的代码不起作用。我有一个后续问题:是否存在概念上等效的解决方法,即实现编译时字符串连接,但以 C++11 实际支持的方式实现?使用 std::string 完全没有必要。

0 投票
3 回答
1560 浏览

c++ - 在编译时测试字节顺序:根据标准,这个 constexpr 函数是否正确?

在寻找一种在编译时检查字节顺序的方法后,我提出了以下解决方案:

GCC 仅在需要 constexpr 的某些情况下接受此代码:

对于第二种情况,GCC 说error: accessing value of ‘a’ through a ‘char’ glvalue in a constant expression. 我在标准中找不到任何禁止此类事情的内容。也许有人可以澄清在哪种情况下GCC是正确的?

0 投票
3 回答
3199 浏览

c++ - 基于 constexpr 的计算图灵是否完整?

我们知道C++ 模板元编程是图灵完备的,但预处理器元编程不是

C++11 为我们提供了一种新的元编程形式:constexpr 函数的计算。这种计算形式是图灵完备的吗?我在想,由于在 constexpr 函数中允许递归和条件运算符 (?:) ,它会是这样,但我希望有更多专业知识的人来确认。

0 投票
2 回答
543 浏览

c++ - “return-by-reference”或“pass-by-reference”参数何时与 constexpr 兼容?

标记为 constexpr 的函数应该是不可变的纯函数。从“std::max() and std::min() not constexpr”帖子中,您不能将 const-reference 输入重新引导为输出,因为这需要参数具有永久性。const但是,只要不重新引导参数,您可以通过-reference 获取参数吗?

constexpr相反,您可以返回对启用类型的子对象的 const 引用吗?

或者甚至子对象的回报也必须是按价值计算的?

(对不起,如果这是基本的,但我发现的一切都围绕这一点跳舞,但实际上并没有确定性。)

0 投票
5 回答
6183 浏览

c++ - constexpr 函数求值可以做尾递归优化吗

我想知道对于长循环,我们是否可以利用 C++11 中 constexpr 的尾递归?

0 投票
3 回答
1149 浏览

c++ - 如何在 C++11 constexpr 中检查双精度位模式是否为 0x0?

我想检查给定的双精度/浮点变量是否具有实际的位模式 0x0。不要问为什么,它被用在qIsNull()我想成为的 Qt ()中的一个函数中constexpr

原始代码使用联合:

这当然是行不通constexpr的。

下一次尝试是reinterpret_cast

但是,虽然它在 GCC 4.7 中作为 a 起作用constexpr,但在 Clang 3.1 中它失败了(正确地,指针操作的 b/c)。

最后的想法是去 Alexandrescuesque 并这样做:

但这对 Clang 来说还不够聪明:

还有其他人有什么好主意吗?