问题标签 [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 回答
10641 浏览

c++ - 在常量表达式中使用 numeric_limits::max()

我想在一个类中定义一个常量,它的值是最大可能的 int。像这样的东西:

此声明无法编译并显示以下消息:

numeric.cpp:8:错误:'std::numeric_limits::max()' 不能出现在常量表达式中 numeric.cpp:8:错误:函数调用不能出现在常量表达式中

我明白为什么这不起作用,但有两件事对我来说很奇怪:

  1. 在我看来,在常量表达式中使用值是一个自然的决定。为什么语言设计者决定让max()成为一个函数,从而不允许这种用法?

  2. 该规范在 18.2.1 中声称

    对于在 numeric_limits 模板中声明为 static const 的所有成员,特化应以可用作整数常量表达式的方式定义这些值。

    这是否意味着我应该能够在我的场景中使用它并且它不与错误消息相矛盾?

谢谢你。

0 投票
14 回答
133284 浏览

c++ - 什么时候应该在 C++11 中使用 constexpr 功能?

在我看来,拥有一个“总是返回 5 的函数”正在破坏或淡化“调用函数”的含义。必须有一个原因,或者需要这种能力,否则它不会出现在 C++11 中。为什么会在那里?

在我看来,如果我编写了一个返回文字值的函数,并且我进行了代码审查,那么有人会告诉我,我应该声明一个常量值而不是写 return 5。

0 投票
3 回答
16229 浏览

c++ - 为什么**不**将函数声明为`constexpr`?

任何只包含 return 语句的函数都可以被声明 ,因此如果所有参数都是并且只有函数在其主体中被调用,constexpr则允许在编译时进行评估。有什么理由不声明任何这样的功能吗?constexprconstexprconstexpr

例子:

任何人都可以提供一个声明函数constexpr 会造成任何伤害的例子吗?


一些初步的想法:

即使没有充分的理由声明一个函数constexpr,我也无法想象该constexpr关键字具有过渡作用:它在不需要编译时评估的代码中的缺失将允许不实现编译时评估的编译器仍然可以编译该代码(但在需要它们的代码上可靠地失败,因为使用明确表示constexpr)。

但我不明白的是:如果没有充分的理由声明一个函数 not constexpr,为什么不声明标准库中的每个函数constexpr?(你不能说它还没有完成,因为还没有足够的时间去做,因为为所有人做这件事是不费吹灰之力的——这与决定是否做每一个功能相反constexpr。)—— - 我知道N2976 故意不需要 cstrs 用于许多标准库类型(例如容器),因为这对于可能的实现来说太有限了。让我们将它们排除在参数之外,只是想知道:一旦标准库中的类型实际上有一个constexprcstr,为什么不是每个在它上运行的函数都声明constexpr?

在大多数情况下,您也不能争辩说您可能不喜欢声明函数constexpr,因为您没有设想任何编译时使用:因为如果其他人 evtl. 将使用您的代码,他们可能会看到您没有看到的这种用法。(但当然,对于类型特征类型和类似的东西是允许的。)

所以我想故意不声明一个函数一定有一个很好的理由和一个很好的例子constexpr吗?

(对于“每个函数”,我始终是指:每个满足存在要求的函数constexpr,即,被定义为单个 return 语句,只接受具有 constexpr cstrs 类型的参数并且只调用constexpr函数。从 C++14 开始,更多在此类函数的主体中是允许的:例如,C++14 constexpr 函数可以使用局部变量和循环,因此可以声明更广泛的函数类constexpr。)

问题为什么要std::forward丢弃constexpr-ness?是这个的一个特例。

0 投票
1 回答
1569 浏览

c++ - 获取元组元素的偏移量

我编写了以下代码来获取元组元素的偏移量

这实际上类似于offsetof宏的实现。它看起来很丑,但在 gcc-4.6 上编译和工作正常

打印“1000”。

我对 constexpr 不太了解,所以我的问题是:

  1. 它是合法的c ++吗?
  2. 更重要的是,为什么允许我在 constexpr 函数中调用 std::get (非 constexpr)?

据我了解 constexpr ,编译器被迫在编译时评估表达式的结果,因此在实践中不会发生零解引用。

0 投票
5 回答
13790 浏览

c++ - initializer_list::size() 上的 static_assert

为什么在 a 中是std::initializer_list<_E>::size不允许的static_assert,即使它constexpr在我的 libstdc++ (v. 4.6)中被声明为 a ?

例如,下面的代码:

给出以下错误:

请注意,这对于一个简单的示例来说效果很好:

0 投票
4 回答
2987 浏览

c++ - constexpr 和纯函数之间的关系

我说得对吗,那:

  • 用 定义的任何函数constexpr都是纯函数,并且
  • constexpr如果编译器的成本不是很高,则可以并且必须定义任何纯函数。

如果是这样,为什么 arent<cmath>的函数用 定义constexpr

0 投票
5 回答
13184 浏览

c++ - std::max() 和 std::min() 不是 constexpr

我刚刚注意到新标准定义min(a,b)max(a,b) 没有 constexpr.

来自 25.4.7 的示例,[alg.min.max]:

这不是很遗憾吗?我本来想写

代替

那些不能有constexpr什么理由?

0 投票
6 回答
7357 浏览

c++ - 真的需要 constexpr 吗?

我一直在constexpr研究 C++ 的新特性,但我并不完全理解它的必要性。

例如,下面的代码:

可以替换为:

更新

第二个示例实际上不是标准的 ISO C++(感谢一些用户指出这一点),但某些编译器(例如 gcc)支持它。因此,这并不是const使程序有效,而是 gcc 支持这种非标准功能的事实。(据我所知,这只有在数组被定义为函数或方法的本地时才有可能,因为在编译时仍然必须知道全局数组的大小。)如果我在没有选项-std=c++98 -pedantic-errors的情况下编译,甚至代码

将使用 gcc 编译。

因此,我将尝试重新表述我的问题,同时考虑到到目前为止的反馈(以及我在此期间所做的一些进一步阅读)。

const大量使用关键字。我可以定义一个在const其整个生命周期内具有特定值的常量。可以使用任何表达式初始化常量,该表达式只计算一次,即在创建常量时。对于这些情况,我认为这constexpr毫无用处:它会引入一个非常小的优化,因为定义常量值的表达式将在编译时而不是运行时计算。每次我需要一个带有复杂初始化的运行时常量时,我​​都会使用关键字const.

所以constexpr在我们需要在编译时初始化一个常量的情况下可能会派上用场。一个例子是向量定义:标准不支持在运行时定义大小。另一个示例是具有一个或多个非类型参数的模板。

在这种情况下,我通常使用宏:

但是,如果我理解正确,constexpr函数比宏更强大,因为它们允许constexpr在其定义中递归调用函数。但是,我想不出任何实际应用程序中我曾经想使用如此复杂的计算来定义编译时常量。

因此,即使它可能是一个有趣的功能,我仍然想知道它是否需要(即它多久可以解决宏不够用的情况)。也许看看一些无法用宏解决的现实例子会帮助我改变这种看法。

0 投票
1 回答
1597 浏览

c++ - 使用 constexpr 函数作为模板参数是否有效?

我已经用 ideone 编译了这段代码。并且想知道为什么它会给出编译错误。constexpr函数不允许作为template参数还是编译器中的错误?

编辑:更改const int get()int get() 此外,ideone 还有一个错误是,如果您删除,constexpr仍然允许声明数组!我认为这是 C99 的功能。

0 投票
4 回答
23708 浏览

c++ - lambda 函数/表达式是否支持 constexpr?

使用 gcc-4.6 我得到类似的东西,error: function needs to be constexpr. 我constexpr在不同的地方尝试了多种组合,但没有运气。

是否constexpr也支持 lambda 函数(无论是否return指定类型)?什么是正确的语法?

任何可能的解决方法?