问题标签 [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.
c++ - 是否有替换 X 宏的模板/constexpr/C++11 方式?
有没有办法使用 C++11 功能替换Xmacro习语,最好不使用预处理器?我在想可以使用元组模板,但我仍在尝试了解这些模板是如何工作的。
c++ - 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
。假设我enum
从0
to 开始,最直接的方法是创建一个大小为结果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++ 在如此不同的时间内运行?
如果我fib
用constexpr
参数调用,我不能比编译器完全优化函数调用做得更好。但是,如果我fib
使用非constexpr
参数调用,我可能希望它调用我自己的版本,该版本实现了诸如 memoization 之类的东西(这将需要状态),所以我得到的运行时间类似于我传递constexpr
参数时的编译时间.
c++ - Consexpr 变量在 Lambda 中显示为未初始化
在下面的代码示例中,我希望输出如下,因为x
它是一个static constexpr
变量。
但是,当我使用 编译时,g++ 警告我x
在 lambda 函数内部未初始化-Wall
,并且输出的最后三行有所不同,可能是因为正在打印堆栈上未初始化内存的值。这是程序在使用 options 编译时产生的一种可能的输出-Wall -std=c++0x
。为什么输出不是我期望的那样?
如果有帮助,则constexpr
在声明中删除时会产生预期的输出constexpr T x
。
示例程序
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)
c++ - 带有字符串操作的 constexpr 解决方法?
这个先前回答的问题解释了为什么我在下面发布的代码不起作用。我有一个后续问题:是否存在概念上等效的解决方法,即实现编译时字符串连接,但以 C++11 实际支持的方式实现?使用 std::string 完全没有必要。
c++ - 在编译时测试字节顺序:根据标准,这个 constexpr 函数是否正确?
在寻找一种在编译时检查字节顺序的方法后,我提出了以下解决方案:
GCC 仅在需要 constexpr 的某些情况下接受此代码:
对于第二种情况,GCC 说error: accessing value of ‘a’ through a ‘char’ glvalue in a constant expression
. 我在标准中找不到任何禁止此类事情的内容。也许有人可以澄清在哪种情况下GCC是正确的?
c++ - 基于 constexpr 的计算图灵是否完整?
我们知道C++ 模板元编程是图灵完备的,但预处理器元编程不是。
C++11 为我们提供了一种新的元编程形式:constexpr 函数的计算。这种计算形式是图灵完备的吗?我在想,由于在 constexpr 函数中允许递归和条件运算符 (?:) ,它会是这样,但我希望有更多专业知识的人来确认。
c++ - “return-by-reference”或“pass-by-reference”参数何时与 constexpr 兼容?
标记为 constexpr 的函数应该是不可变的纯函数。从“std::max() and std::min() not constexpr”帖子中,您不能将 const-reference 输入重新引导为输出,因为这需要参数具有永久性。const
但是,只要不重新引导参数,您可以通过-reference 获取参数吗?
constexpr
相反,您可以返回对启用类型的子对象的 const 引用吗?
或者甚至子对象的回报也必须是按价值计算的?
(对不起,如果这是基本的,但我发现的一切都围绕这一点跳舞,但实际上并没有确定性。)
c++ - constexpr 函数求值可以做尾递归优化吗
我想知道对于长循环,我们是否可以利用 C++11 中 constexpr 的尾递归?
c++ - 如何在 C++11 constexpr 中检查双精度位模式是否为 0x0?
我想检查给定的双精度/浮点变量是否具有实际的位模式 0x0。不要问为什么,它被用在qIsNull()
我想成为的 Qt ()中的一个函数中constexpr
。
原始代码使用联合:
这当然是行不通constexpr
的。
下一次尝试是reinterpret_cast
:
但是,虽然它在 GCC 4.7 中作为 a 起作用constexpr
,但在 Clang 3.1 中它失败了(正确地,指针操作的 b/c)。
最后的想法是去 Alexandrescuesque 并这样做:
但这对 Clang 来说还不够聪明:
还有其他人有什么好主意吗?