gpt4 book ai didi

c++ - clang 说对 void consteval 函数的调用不是常量表达式

转载 作者:行者123 更新时间:2023-12-01 14:08:02 25 4
gpt4 key购买 nike

clang(trunk) 给出以下代码的错误:

consteval void f() {}

int main()
{
f(); // error: call to consteval function 'f' is not a constant expression
// note: subobject of type 'void' is not initialized
}
而 gcc(trunk) 编译这个没有错误。
我觉得这可能是一个 clang 错误,因为 gcc 和 clang 都接受以下代码:
consteval int g() { return 42; }

int main()
{
g(); // ok
}
这是要玩的 code
那么这是一个clang错误,还是代码格式错误,或者有ub,或者其他什么?

编辑:我觉得指出 clang 允许从其他函数调用 f 如果它们也是 consteval 可能是相关的。它仅在从非 consteval 函数调用 f 时给出错误:
consteval int h() 
{
f(); // ok
return 42;
}
demo

最佳答案

这是一个 Clang 错误,上个月在版本 10 和版本 11 以及 fixed 之间引入。 Clang 中 consteval 的实现大部分(但不完全)是完整的,并且在添加更完整的 consteval 支持的补丁之一之后出现了此错误。
详细信息:Clang 常量评估器的顶级入口点检查结果是否是常量表达式的允许结果——它检查结果是否不包含指向自动存储持续时间或临时或类似内容的指针。但是此检查从未更新以适应 void 作为文字类型的情况,并且会拒绝 void 类型的值“未初始化”。在添加 consteval 支持之前从未注意到这一点,因为所有顶级常量评估都是非 void 类型。

关于c++ - clang 说对 void consteval 函数的调用不是常量表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63364918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com