问题标签 [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.
rust - 从 rust 中的 json 数据静态编译实例
我想在编译时(不是运行时)从文件加载的 JSON 数据创建一个静态实例(类似于 constexpr):
例子:
c++17 - 在编译时连接字符串文字
我需要将可变数量的字符串文字连接成一个以在 static_assert() 中使用它
我尝试使用带有结构的模板,但编译器不喜欢将文字作为模板参数。
我也尝试过完美转发,但出现错误:‘args#0’ is not a constant expression
澄清一下,我不能这样做,"string1" "string2"
因为我从函数中得到的一些字符串返回了。
请不要建议 strlen 或 memcpy 之类的东西。我知道,它们可以在编译时计算出来。
c++ - 为什么在模板化类之外时返回 std::string 的 constexpr 函数不能编译?
注意:我使用的是 gcc,但在 godbolt.org 上进行了测试,它也适用于 msvc,但不适用于 clang
我偶然发现以下简单函数在模板类中编译,但不是作为自由函数。有人可以解释为什么吗?
编译正常:
不编译:
抛出错误:
c++ - 编译器无法执行 constexpr 表达式
我有这样的代码:
我知道这是虚拟代码,但我将其隔离以查找错误。
编译器给我错误(GCC):
我尝试将限定符const添加到函数参数,但它同样不起作用。理论上,所有这些函数都可以在编译时计算。但是我的知识找不到问题在哪里。
c++ - C++20 中 constexpr 虚函数有什么好处?
我可以很容易地说,通过将函数声明为constexpr
,我们在编译时对其进行评估,这样可以在运行时节省时间,因为结果已经生成。
另一方面,虚函数需要在运行时解析。因此,我想我们无法摆脱解决过程。由于函数的机制,只有结果可以快速获取constexpr
。
constexpr virtual
函数还有其他好处吗?
c++ - “constexpr”函数中“文字类型”的要求
这是我的代码:
constexpr 函数的定义应满足以下要求: ...
- 它的每个参数类型都应该是文字类型;...
一个类型是文字类型,如果它是: ...
- 它要么是闭包类型,要么是聚合类型,要么是...
我理解不是文字类型的原因agg_t2
是它违反了规则dcl.init.aggr#1.1:
聚合是一个数组或一个类...
- 没有用户声明或继承的构造函数...
而且我认为agg_t1
可能不是文字类型,因为它也违反了规则dcl.init.aggr#1.1:
聚合是一个数组或一个类...
- 没有私有或受保护的直接非静态数据成员...
但是......编译器结果告诉我我对agg_t1
.
我的问题是:
如果agg_t1
私有数据成员x
使其成为非聚合类型,那么为什么在函数定义中agg_t1
允许该类型?constexpr
ce1
c++ - 不应将“constexpr”函数声明为“内联”
通过使用SonarLint分析代码,我收到了一条关于声明如下的析构函数的消息(问题的标题) :
这是消息的描述: 声明一个函数或一个静态成员变量 constexpr 使其隐式内联。
我不认为此类的 dtor 可以是constexpr
,或者consteval
因为它具有类型的非静态数据成员,std::vector
因此~Foo
必须在某些时候调用delete[]
以释放向量的存储空间。
那么为什么SonarLint 会显示此消息?是因为 = default
? 是否有任何默认的特殊成员函数隐式变为constexpr
?
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)。
小心
迈克尔