如何解决铛说对无效约束函数的调用不是常量表达式
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
也是有意义的。仅当从非经典函数调用f
时,才会给出错误:
consteval int h()
{
f(); // ok
return 42;
}
demo。
解决方法
这是一个Clang错误,在10版和11版之间以及上个月的fixed之间都引入了。 consteval
在Clang中的实现大部分(但不是全部)是完整的,并且该错误是在其中一个补丁添加了更完整的consteval
支持之后出现的。
详细信息:Clang常量评估器的顶级入口点检查结果是否为常量表达式的允许结果-检查结果是否不包含指向自动存储持续时间的指针或临时或类似的指针。但是,此检查从未更新过以适应void
是文字类型,并且会拒绝类型为void
的值“未初始化”。在添加consteval
支持之前从未注意到这一点,因为所有顶级常量评估都是非void
类型的。
我发现c++20 final draft是:
9.2.5 constexpr和constevals修饰符[dcl.constexpr] (2)在函数的声明中使用的constexpr或consteval说明符将该函数声明为constexpr函数。用consteval说明符声明的函数或构造函数称为即时函数。析构函数,分配函数或解除分配函数不得使用consteval说明符声明。
(3)constexpr函数的定义应满足以下要求:
3.1其返回类型(如果有)应为文字类型;
和
6.8类型[basic.types]
(10)如果类型为:
(10.1)简历无效
...
因为此void
是consteval
函数的有效返回类型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。