问题标签 [constexpr-function]

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 回答
127 浏览

rust - 从 rust 中的 json 数据静态编译实例

我想在编译时(不是运行时)从文件加载的 JSON 数据创建一个静态实例(类似于 constexpr):

例子:

0 投票
1 回答
74 浏览

c++17 - 在编译时连接字符串文字

我需要将可变数量的字符串文字连接成一个以在 static_assert() 中使用它

我尝试使用带有结构的模板,但编译器不喜欢将文字作为模板参数。

我也尝试过完美转发,但出现错误:‘args#0’ is not a constant expression

澄清一下,我不能这样做,"string1" "string2"因为我从函数中得到的一些字符串返回了。

请不要建议 strlen 或 memcpy 之类的东西。我知道,它们可以在编译时计算出来。

0 投票
1 回答
56 浏览

c++ - 为什么在模板化类之外时返回 std::string 的 constexpr 函数不能编译?

注意:我使用的是 gcc,但在 godbolt.org 上进行了测试,它也适用于 msvc,但不适用于 clang

我偶然发现以下简单函数在模板类中编译,但不是作为自由函数。有人可以解释为什么吗?

编译正常:

不编译:

抛出错误:

0 投票
3 回答
128 浏览

c++ - 编译器无法执行 constexpr 表达式

我有这样的代码:

我知道这是虚拟代码,但我将其隔离以查找错误。

编译器给我错误(GCC):

我尝试将限定符const添加到函数参数,但它同样不起作用。理论上,所有这些函数都可以在编译时计算。但是我的知识找不到问题在哪里。

0 投票
1 回答
118 浏览

c++ - C++20 中 constexpr 虚函数有什么好处?

我可以很容易地说,通过将函数声明为constexpr,我们在编译时对其进行评估,这样可以在运行时节省时间,因为结果已经生成。

另一方面,虚函数需要在运行时解析。因此,我想我们无法摆脱解决过程。由于函数的机​​制,只有结果可以快速获取constexpr

constexpr virtual函数还有其他好处吗?

0 投票
1 回答
100 浏览

c++ - “constexpr”函数中“文字类型”的要求

这是我的代码:


根据dcl.constexpr

constexpr 函数的定义应满足以下要求: ...

  • 它的每个参数类型都应该是文字类型;...

basic#types.general-10

一个类型是文字类型,如果它是: ...

  • 它要么是闭包类型,要么是聚合类型,要么是...

我理解不是文字类型的原因agg_t2是它违反了规则dcl.init.aggr#1.1

聚合是一个数组或一个类...

  • 没有用户声明或继承的构造函数...

而且我认为agg_t1可能不是文字类型,因为它也违反了规则dcl.init.aggr#1.1

聚合是一个数组或一个类...

  • 没有私有或受保护的直接非静态数据成员...

但是......编译器结果告诉我我对agg_t1.

我的问题是:

如果agg_t1私有数据成员x使其成为非聚合类型,那么为什么在函数定义中agg_t1允许该类型?constexprce1

0 投票
1 回答
124 浏览

c++ - 不应将“constexpr”函数声明为“内联”

通过使用SonarLint分析代码,我收到了一条关于声明如下的析构函数的消息(问题的标题) :

这是消息的描述声明一个函数或一个静态成员变量 constexpr 使其隐式内联。

我不认为此类的 dtor 可以是constexpr,或者consteval因为它具有类型的非静态数据成员,std::vector因此~Foo必须在某些时候调用delete[]以释放向量的存储空间。

那么为什么SonarLint 会显示此消息?是因为 = default? 是否有任何默认的特殊成员函数隐式变为constexpr

0 投票
2 回答
56 浏览

c++ - 在多个模块中共享的 constexpr 函数

当我使用 constexpr 函数时,我注意到一个奇怪的行为。我将代码简化为一个简化的示例。从两个不同的翻译单元(模块 A 和 B)调用两个函数。

这些模块看起来很相似。这是 mod_a.cpp:

只有一些内部常数不同。这是 mod_b.cpp:

两个模块都使用constexpr“common.h”中定义的通用函数:

我很惊讶这两个函数都返回 12。由于#include指令(应该只包含一些源代码),我认为两个模块之间没有交互。当我get_product也定义为时static,行为如预期: mod_a()返回 12, mod_b()返回 42。

我还在https://www.youtube.com/watch?v=4pKtPWcl1Go上查看了 Jason Turner 的 C++ Weekly: Stop Using 'constexpr' (And Use This!) 第 312 集。

一般使用的建议static constexpr是一个很好的提示。

但我仍然想知道我在没有static关键字的情况下注意到的行为是否定义明确。还是UB?或者它是一个编译器错误?

除了constexpr函数,我还尝试了一个 C 风格的宏#define get_product() (X*Y),它也向我展示了预期的结果(12 和 42)。

小心

迈克尔