compile-time

为什么C++的 noexcept() 对constexpr函数返回false?

此问题在此处已有解答: noexcept 行为的 constexpr 函数 (共2 条答案) 已于17小时前关闭。 根据cppreference.com对 constexpr的条目(此处),如果函数是constexpr,noexcept() 将返回true。以下是相关示例: constexpr int f() { return 0; } constexpr bool b2 = noexcept(f

在不使用constexpr的情况下使用模板

在我实际的代码中,我有一个模板函数,其行为会根据输入的数据类型而变化。我必须找到一种方法,将输入数组的数据类型传递给该函数。变量tA、tB和tC是一个enum的一部分,这个enum提示输入数组的数据类型。若有助于理解,在实际代码中,输入数组是void*。问题在于,在我的实际代码中(我无法提供)变量tA、tB和tC不能是constexpr,这会在编译时导致错误: error: non-type template argument is not a constant expression 56 | some_

标准是否允许在编译时比较指向不完整类型的extern const变量的指针?

以下代码被MSVC与 Clang接受,但在GCC(自13.2及其后续版本,包含trunk)中被拒绝,错误信息为 non-constant condition for static assertion.(https://godbolt.org/z/eneq3TWvs) struct A; extern const A a1; extern const A a2; static_assert(&a1 != &a2); 然而,如果 struct A 是一个完整对象(https://godbolt.org/z/d

为什么concat! 宏对const变量不起作用?

由于 const 变量在编译时就会被求值,为什么在使用 concat! 宏将多个 const &str 变量拼接时,不能使用它们? 我参考了这份 指南,因为它说可以使用 concat! 宏将 const 变量拼接在一起。但当我尝试编译下面的代码时,编译失败了: const APP_NAME: &str = "MyApp"; const APP_MAJOR: u8 = 1; const APP_MINOR: u8 = 2; fn main() { let version = concat!(APP_NAME

编写一个接收std::meta::info的函数

我正在尝试编写一个函数,它将 std::meta::info 作为参数,然后在其中使用它。我的计划最终是编写一个递归函数来统计一个类型拥有的基类数量。 我理解函数参数不是常量表达式,所以这个错误是可以预期的。 要把它放进一个函数中并让它编译,我需要做些什么? consteval auto func(std::meta::info type) -> void { constexpr auto ctx = std::meta::access_context::unchecked(); constexpr au

在宏展开时禁用语法检查

在运行宏的过程中,是否可以通过编程方式禁用语法检查? // disable during macro // Syntax check disable => how ??? // Macro runs ... // re-enable once done // Syntax check enable => how ??? 语法检查会显著减慢宏的执行速度。 哪些方法不起作用或不够用: 隐藏“语法检查器”栏 Redraw = false; 也可以取消勾选 自定义 → 语法检查 → “自动刷新” 也能加速宏的执行

经consteval与反射处理后的输出文件

我知道我可以得到预处理后的文件。我也知道我可以得到汇编文件。 是否有办法得到一个在consteval、反射等处理之后的中间文件?这样就能确保生成的代码看起来符合我的预期。 我正在使用GCC的每周快照,因为16.1.1存在一个会破坏我的代码的缺陷。 我在使用 import std;。当我尝试使用 -save-temps 时,我遇到了这个错误: fatal error: ‘-MF’ and ‘-fdeps-file=’ cannot share an output file test/exco_test/CM

C语言中的constexpr结构体与整型常量表达式

在阅读N3220草案标准中关于“6.6常量表达式”时,显然可以看出: constexpr struct { int i; } S = {.i = 100}; S.i是一个整数常量表达式。 但为什么在编译需要整数常量表达式的代码时,Clang会发出这个检查呢? int main(void) { int i = get_i(); switch(i) { case S.i: break; // warning: expression is not an integer constant expression;

在遍历非静态数据成员时,`template for` 不是constexpr

我在gcc 16.1中尝试新的C++26类型反射特性,并有一段用于将结构体/类转换为JSON的基础代码(见文末)。 我的代码: #include #include #include namespace __impl { template struct replicator_type { template constexpr void operator>>(F body) const { (body.t

在包含块之外对out变量声明的引用存在问题

我在实现一个小型脚本语言时,遇到了一个非常怪异的情况。 请看这个函数: public void Run() { Dictionary data = new(); if (!data.TryGetValue("foo", out System.Reflection.MethodInfo? methodInfo)) { throw new Exception($"Function '' not found in function ma